123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638 |
- #!/usr/bin/tclsh
- #
- # Run this script to generate the pragma name lookup table C code.
- #
- # To add new pragmas, first add the name and other relevant attributes
- # of the pragma to the "pragma_def" object below. Then run this script
- # to generate the ../src/pragma.h header file that contains macros and
- # the lookup table needed for pragma name lookup in the pragma.c module.
- # Then add the extra "case PragTyp_XXXXX:" and subsequent code for the
- # new pragma in ../src/pragma.c.
- #
- # The results are normally written into the ../src/pragma.h file. However,
- # if an alternative output file name is provided as an argument, then
- # results are written into the alternative. For example:
- #
- # tclsh tool/mkpragmatab.tcl ;# <--- Results to src/pragma.h
- #
- # tclsh tool/mkpragmatab.tcl /dev/tty ;# <-- results to terminal
- #
- # Flag meanings:
- set flagMeaning(NeedSchema) {Force schema load before running}
- set flagMeaning(ReadOnly) {Read-only HEADER_VALUE}
- set flagMeaning(Result0) {Acts as query when no argument}
- set flagMeaning(Result1) {Acts as query when has one argument}
- set flagMeaning(SchemaReq) {Schema required - "main" is default}
- set flagMeaning(SchemaOpt) {Schema restricts name search if present}
- set flagMeaning(NoColumns) {OP_ResultRow called with zero columns}
- set flagMeaning(NoColumns1) {zero columns if RHS argument is present}
- set pragma_def {
- NAME: full_column_names
- TYPE: FLAG
- ARG: SQLITE_FullColNames
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: short_column_names
- TYPE: FLAG
- ARG: SQLITE_ShortColNames
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: count_changes
- TYPE: FLAG
- ARG: SQLITE_CountRows
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: empty_result_callbacks
- TYPE: FLAG
- ARG: SQLITE_NullCallback
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: fullfsync
- TYPE: FLAG
- ARG: SQLITE_FullFSync
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: checkpoint_fullfsync
- TYPE: FLAG
- ARG: SQLITE_CkptFullFSync
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: cache_spill
- FLAG: Result0 SchemaReq NoColumns1
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: reverse_unordered_selects
- TYPE: FLAG
- ARG: SQLITE_ReverseOrder
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: query_only
- TYPE: FLAG
- ARG: SQLITE_QueryOnly
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: automatic_index
- TYPE: FLAG
- ARG: SQLITE_AutoIndex
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
- NAME: sql_trace
- TYPE: FLAG
- ARG: SQLITE_SqlTrace
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: vdbe_listing
- TYPE: FLAG
- ARG: SQLITE_VdbeListing
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: vdbe_trace
- TYPE: FLAG
- ARG: SQLITE_VdbeTrace
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: vdbe_addoptrace
- TYPE: FLAG
- ARG: SQLITE_VdbeAddopTrace
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: vdbe_debug
- TYPE: FLAG
- ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: vdbe_eqp
- TYPE: FLAG
- ARG: SQLITE_VdbeEQP
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: ignore_check_constraints
- TYPE: FLAG
- ARG: SQLITE_IgnoreChecks
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: !defined(SQLITE_OMIT_CHECK)
- NAME: writable_schema
- TYPE: FLAG
- ARG: SQLITE_WriteSchema|SQLITE_NoSchemaError
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: read_uncommitted
- TYPE: FLAG
- ARG: SQLITE_ReadUncommit
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: recursive_triggers
- TYPE: FLAG
- ARG: SQLITE_RecTriggers
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: trusted_schema
- TYPE: FLAG
- ARG: SQLITE_TrustedSchema
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- NAME: foreign_keys
- TYPE: FLAG
- ARG: SQLITE_ForeignKeys
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
- NAME: defer_foreign_keys
- TYPE: FLAG
- ARG: SQLITE_DeferFKs
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
- NAME: cell_size_check
- TYPE: FLAG
- ARG: SQLITE_CellSizeCk
- NAME: default_cache_size
- FLAG: NeedSchema Result0 SchemaReq NoColumns1
- COLS: cache_size
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
- NAME: page_size
- FLAG: Result0 SchemaReq NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: secure_delete
- FLAG: Result0
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: page_count
- FLAG: NeedSchema Result0 SchemaReq
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: max_page_count
- TYPE: PAGE_COUNT
- FLAG: NeedSchema Result0 SchemaReq
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: locking_mode
- FLAG: Result0 SchemaReq
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: journal_mode
- FLAG: NeedSchema Result0 SchemaReq
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: journal_size_limit
- FLAG: Result0 SchemaReq
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: cache_size
- FLAG: NeedSchema Result0 SchemaReq NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: mmap_size
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: auto_vacuum
- FLAG: NeedSchema Result0 SchemaReq NoColumns1
- IF: !defined(SQLITE_OMIT_AUTOVACUUM)
- NAME: incremental_vacuum
- FLAG: NeedSchema NoColumns
- IF: !defined(SQLITE_OMIT_AUTOVACUUM)
- NAME: temp_store
- FLAG: Result0 NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: temp_store_directory
- FLAG: NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: data_store_directory
- FLAG: NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
- NAME: lock_proxy_file
- FLAG: NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
- NAME: synchronous
- FLAG: NeedSchema Result0 SchemaReq NoColumns1
- IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
- NAME: table_info
- FLAG: NeedSchema Result1 SchemaOpt
- ARG: 0
- COLS: cid name type notnull dflt_value pk
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: table_xinfo
- TYPE: TABLE_INFO
- FLAG: NeedSchema Result1 SchemaOpt
- ARG: 1
- COLS: cid name type notnull dflt_value pk hidden
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: table_list
- TYPE: TABLE_LIST
- FLAG: NeedSchema Result1
- COLS: schema name type ncol wr strict
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: stats
- FLAG: NeedSchema Result0 SchemaReq
- COLS: tbl idx wdth hght flgs
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG)
- NAME: index_info
- TYPE: INDEX_INFO
- ARG: 0
- FLAG: NeedSchema Result1 SchemaOpt
- COLS: seqno cid name
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: index_xinfo
- TYPE: INDEX_INFO
- ARG: 1
- FLAG: NeedSchema Result1 SchemaOpt
- COLS: seqno cid name desc coll key
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: index_list
- FLAG: NeedSchema Result1 SchemaOpt
- COLS: seq name unique origin partial
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: database_list
- FLAG: Result0
- COLS: seq name file
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: function_list
- FLAG: Result0
- COLS: name builtin type enc narg flags
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
- NAME: module_list
- FLAG: Result0
- COLS: name
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- IF: !defined(SQLITE_OMIT_VIRTUALTABLE)
- IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
- NAME: pragma_list
- FLAG: Result0
- COLS: name
- IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
- NAME: collation_list
- FLAG: Result0
- COLS: seq name
- IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
- NAME: foreign_key_list
- FLAG: NeedSchema Result1 SchemaOpt
- COLS: id seq table from to on_update on_delete match
- IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
- NAME: foreign_key_check
- FLAG: NeedSchema Result0 Result1 SchemaOpt
- COLS: table rowid parent fkid
- IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
- NAME: parser_trace
- TYPE: FLAG
- ARG: SQLITE_ParserTrace
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- IF: defined(SQLITE_DEBUG)
- NAME: case_sensitive_like
- FLAG: NoColumns
- IF: !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA)
- NAME: integrity_check
- FLAG: NeedSchema Result0 Result1 SchemaOpt
- IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
- NAME: quick_check
- TYPE: INTEGRITY_CHECK
- FLAG: NeedSchema Result0 Result1 SchemaOpt
- IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
- NAME: encoding
- FLAG: Result0 NoColumns1
- IF: !defined(SQLITE_OMIT_UTF16)
- NAME: schema_version
- TYPE: HEADER_VALUE
- ARG: BTREE_SCHEMA_VERSION
- FLAG: NoColumns1 Result0
- IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
- NAME: user_version
- TYPE: HEADER_VALUE
- ARG: BTREE_USER_VERSION
- FLAG: NoColumns1 Result0
- IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
- NAME: data_version
- TYPE: HEADER_VALUE
- ARG: BTREE_DATA_VERSION
- FLAG: ReadOnly Result0
- IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
- NAME: freelist_count
- TYPE: HEADER_VALUE
- ARG: BTREE_FREE_PAGE_COUNT
- FLAG: ReadOnly Result0
- IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
- NAME: application_id
- TYPE: HEADER_VALUE
- ARG: BTREE_APPLICATION_ID
- FLAG: NoColumns1 Result0
- IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
- NAME: compile_options
- FLAG: Result0
- IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
- NAME: wal_checkpoint
- FLAG: NeedSchema
- COLS: busy log checkpointed
- IF: !defined(SQLITE_OMIT_WAL)
- NAME: wal_autocheckpoint
- IF: !defined(SQLITE_OMIT_WAL)
- NAME: shrink_memory
- FLAG: NoColumns
- NAME: busy_timeout
- FLAG: Result0
- COLS: timeout
- NAME: lock_status
- FLAG: Result0
- COLS: database status
- IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
- NAME: activate_extensions
- IF: defined(SQLITE_ENABLE_CEROD)
- NAME: soft_heap_limit
- FLAG: Result0
- NAME: hard_heap_limit
- FLAG: Result0
- NAME: threads
- FLAG: Result0
- NAME: analysis_limit
- FLAG: Result0
- NAME: optimize
- FLAG: Result1 NeedSchema
- NAME: legacy_alter_table
- TYPE: FLAG
- ARG: SQLITE_LegacyAlter
- IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
- }
- # Open the output file
- #
- if {$argc>0} {
- set destfile [lindex $argv 0]
- } else {
- set destfile "[file dir [file dir [file normal $argv0]]]/src/pragma.h"
- puts "Overwriting $destfile with new pragma table..."
- }
- set fd [open $destfile wb]
- puts $fd {/* DO NOT EDIT!
- ** This file is automatically generated by the script at
- ** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit
- ** that script and rerun it.
- */}
- # Parse the PRAGMA table above.
- #
- set name {}
- set type {}
- set if {}
- set flags {}
- set cols {}
- set cols_list {}
- set arg 0
- proc record_one {} {
- global name type if arg allbyname typebyif flags cols all_cols
- global cols_list colUsedBy
- if {$name==""} return
- if {$cols!=""} {
- if {![info exists all_cols($cols)]} {
- set all_cols($cols) 1
- lappend cols_list $cols
- }
- set cx $cols
- lappend colUsedBy($cols) $name
- } else {
- set cx 0
- }
- set allbyname($name) [list $type $arg $if $flags $cols]
- set name {}
- set type {}
- set if {}
- set flags {}
- set cols {}
- set arg 0
- }
- foreach line [split $pragma_def \n] {
- set line [string trim $line]
- if {$line==""} continue
- foreach {id val} [split $line :] break
- set val [string trim $val]
- if {$id=="NAME"} {
- record_one
- set name $val
- set type [string toupper $val]
- } elseif {$id=="TYPE"} {
- set type $val
- if {$type=="FLAG"} {
- lappend flags Result0 NoColumns1
- }
- } elseif {$id=="ARG"} {
- set arg $val
- } elseif {$id=="COLS"} {
- set cols $val
- } elseif {$id=="IF"} {
- lappend if $val
- } elseif {$id=="FLAG"} {
- foreach term [split $val] {
- lappend flags $term
- set allflags($term) 1
- }
- } else {
- error "bad pragma_def line: $line"
- }
- }
- record_one
- set allnames [lsort [array names allbyname]]
- # Generate #defines for all pragma type names. Group the pragmas that are
- # omit in default builds (ex: defined(SQLITE_DEBUG))
- # at the end.
- #
- puts $fd "\n/* The various pragma types */"
- set pnum 0
- foreach name $allnames {
- set type [lindex $allbyname($name) 0]
- if {[info exists seentype($type)]} continue
- set if [lindex $allbyname($name) 2]
- if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
- set seentype($type) 1
- puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
- incr pnum
- }
- foreach name $allnames {
- set type [lindex $allbyname($name) 0]
- if {[info exists seentype($type)]} continue
- set if [lindex $allbyname($name) 2]
- if {[regexp SQLITE_DEBUG $if]} continue
- set seentype($type) 1
- puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
- incr pnum
- }
- foreach name $allnames {
- set type [lindex $allbyname($name) 0]
- if {[info exists seentype($type)]} continue
- set seentype($type) 1
- puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
- incr pnum
- }
- # Generate #defines for flags
- #
- puts $fd "\n/* Property flags associated with various pragma. */"
- set fv 1
- foreach f [lsort [array names allflags]] {
- puts $fd [format {#define PragFlg_%-10s 0x%02x /* %s */} \
- $f $fv $flagMeaning($f)]
- set fv [expr {$fv*2}]
- }
- # Sort the column lists so that longer column lists occur first
- #
- proc colscmp {a b} {
- return [expr {[llength $b] - [llength $a]}]
- }
- set cols_list [lsort -command colscmp $cols_list]
- # Generate the array of column names used by pragmas that act like
- # queries.
- #
- puts $fd "\n/* Names of columns for pragmas that return multi-column result"
- puts $fd "** or that return single-column results where the name of the"
- puts $fd "** result column is different from the name of the pragma\n*/"
- puts $fd "static const char *const pragCName\[\] = {"
- set offset 0
- set allcollist {}
- foreach cols $cols_list {
- set n [llength $cols]
- set limit [expr {[llength $allcollist] - $n}]
- for {set i 0} {$i<$limit} {incr i} {
- set sublist [lrange $allcollist $i [expr {$i+$n-1}]]
- if {$sublist==$cols} {
- puts $fd [format "%27s/* $colUsedBy($cols) reuses $i */" ""]
- set cols_offset($cols) $i
- break
- }
- }
- if {$i<$limit} continue
- set cols_offset($cols) $offset
- set ub " /* Used by: $colUsedBy($cols) */"
- foreach c $cols {
- lappend allcollist $c
- puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub]
- set ub ""
- incr offset
- }
- }
- puts $fd "\175;"
- # Generate the lookup table
- #
- puts $fd "\n/* Definitions of all built-in pragmas */"
- puts $fd "typedef struct PragmaName \173"
- puts $fd " const char *const zName; /* Name of pragma */"
- puts $fd " u8 ePragTyp; /* PragTyp_XXX value */"
- puts $fd " u8 mPragFlg; /* Zero or more PragFlg_XXX values */"
- puts $fd { u8 iPragCName; /* Start of column names in pragCName[] */}
- puts $fd " u8 nPragCName; \
- /* Num of col names. 0 means use pragma name */"
- puts $fd " u64 iArg; /* Extra argument */"
- puts $fd "\175 PragmaName;"
- puts $fd "static const PragmaName aPragmaName\[\] = \173"
- set current_if {}
- set spacer [format { %26s } {}]
- foreach name $allnames {
- foreach {type arg if flag cx} $allbyname($name) break
- if {$cx==0 || $cx==""} {
- set cy 0
- set nx 0
- } else {
- set cy $cols_offset($cx)
- set nx [llength $cx]
- }
- if {$if!=$current_if} {
- if {$current_if!=""} {
- foreach this_if $current_if {
- puts $fd "#endif"
- }
- }
- set current_if $if
- if {$current_if!=""} {
- foreach this_if $current_if {
- puts $fd "#if $this_if"
- }
- }
- }
- set typex [format PragTyp_%-23s $type,]
- if {$flag==""} {
- set flagx "0"
- } else {
- set flagx PragFlg_[join $flag {|PragFlg_}]
- }
- puts $fd " \173/* zName: */ \"$name\","
- puts $fd " /* ePragTyp: */ PragTyp_$type,"
- puts $fd " /* ePragFlg: */ $flagx,"
- puts $fd " /* ColNames: */ $cy, $nx,"
- puts $fd " /* iArg: */ $arg \175,"
- }
- if {$current_if!=""} {
- foreach this_if $current_if {
- puts $fd "#endif"
- }
- }
- puts $fd "\175;"
- # count the number of pragmas, for information purposes
- #
- set allcnt 0
- set dfltcnt 0
- foreach name $allnames {
- incr allcnt
- set if [lindex $allbyname($name) 2]
- if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
- incr dfltcnt
- }
- puts $fd "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"
|