blob: a5d9f5ab6db0c2616080ad09a94dd82289b373fa [file] [log] [blame]
drh9ccd8652013-09-13 16:36:46 +00001#!/usr/bin/tclsh
2#
3# Run this script to generate the pragma name lookup table C code.
4#
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 C-code for the lookup table and copy/paste the output
8# of this script into the appropriate spot in the pragma.c source file.
9# Then add the extra "case PragTyp_XXXXX:" and subsequent code for the
10# new pragma.
11#
12
13set pragma_def {
14 NAME: full_column_names
15 TYPE: FLAG
16 ARG: SQLITE_FullColNames
17
18 NAME: short_column_names
19 TYPE: FLAG
20 ARG: SQLITE_ShortColNames
21
22 NAME: count_changes
23 TYPE: FLAG
24 ARG: SQLITE_CountRows
25
26 NAME: empty_result_callbacks
27 TYPE: FLAG
28 ARG: SQLITE_NullCallback
29
30 NAME: legacy_file_format
31 TYPE: FLAG
32 ARG: SQLITE_LegacyFileFmt
33
34 NAME: fullfsync
35 TYPE: FLAG
36 ARG: SQLITE_FullFSync
37
38 NAME: checkpoint_fullfsync
39 TYPE: FLAG
40 ARG: SQLITE_CkptFullFSync
41
42 NAME: cache_spill
43 TYPE: FLAG
44 ARG: SQLITE_CacheSpill
45
46 NAME: reverse_unordered_selects
47 TYPE: FLAG
48 ARG: SQLITE_ReverseOrder
49
50 NAME: query_only
51 TYPE: FLAG
52 ARG: SQLITE_QueryOnly
53
54 NAME: automatic_index
55 TYPE: FLAG
56 ARG: SQLITE_AutoIndex
57 IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
58
59 NAME: sql_trace
60 TYPE: FLAG
61 ARG: SQLITE_SqlTrace
62 IF: defined(SQLITE_DEBUG)
63
64 NAME: vdbe_listing
65 TYPE: FLAG
66 ARG: SQLITE_VdbeListing
67 IF: defined(SQLITE_DEBUG)
68
69 NAME: vdbe_trace
70 TYPE: FLAG
71 ARG: SQLITE_VdbeTrace
72 IF: defined(SQLITE_DEBUG)
73
74 NAME: vdbe_addoptrace
75 TYPE: FLAG
76 ARG: SQLITE_VdbeAddopTrace
77 IF: defined(SQLITE_DEBUG)
78
79 NAME: vdbe_debug
80 TYPE: FLAG
81 ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
82 IF: defined(SQLITE_DEBUG)
83
84 NAME: ignore_check_constraints
85 TYPE: FLAG
86 ARG: SQLITE_IgnoreChecks
87 IF: !defined(SQLITE_OMIT_CHECK)
88
89 NAME: writable_schema
90 TYPE: FLAG
91 ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode
92
93 NAME: read_uncommitted
94 TYPE: FLAG
95 ARG: SQLITE_ReadUncommitted
96
97 NAME: recursive_triggers
98 TYPE: FLAG
99 ARG: SQLITE_RecTriggers
100
101 NAME: foreign_keys
102 TYPE: FLAG
103 ARG: SQLITE_ForeignKeys
104 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
105
106 NAME: defer_foreign_keys
107 TYPE: FLAG
108 ARG: SQLITE_DeferFKs
109 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
110
111 NAME: default_cache_size
drhf63936e2013-10-03 14:08:07 +0000112 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000113 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
114
115 NAME: page_size
116 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
117
118 NAME: secure_delete
119 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
120
121 NAME: page_count
drhf63936e2013-10-03 14:08:07 +0000122 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000123 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
124
125 NAME: max_page_count
126 TYPE: PAGE_COUNT
drhf63936e2013-10-03 14:08:07 +0000127 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000128 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
129
130 NAME: locking_mode
131 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
132
133 NAME: journal_mode
drhf63936e2013-10-03 14:08:07 +0000134 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000135 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
136
137 NAME: journal_size_limit
138 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
139
140 NAME: cache_size
drhf63936e2013-10-03 14:08:07 +0000141 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000142 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
143
144 NAME: mmap_size
145 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
146
147 NAME: auto_vacuum
drhf63936e2013-10-03 14:08:07 +0000148 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000149 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
150
151 NAME: incremental_vacuum
drhf63936e2013-10-03 14:08:07 +0000152 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000153 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
154
155 NAME: temp_store
156 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
157
158 NAME: temp_store_directory
159 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
160
161 NAME: data_store_directory
162 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
163
164 NAME: lock_proxy_file
165 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
166
167 NAME: synchronous
drhf63936e2013-10-03 14:08:07 +0000168 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000169 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
170
171 NAME: table_info
drhf63936e2013-10-03 14:08:07 +0000172 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000173 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
174
175 NAME: index_info
drhf63936e2013-10-03 14:08:07 +0000176 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000177 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
178
179 NAME: index_list
drhf63936e2013-10-03 14:08:07 +0000180 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000181 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
182
183 NAME: database_list
drhf63936e2013-10-03 14:08:07 +0000184 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000185 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
186
187 NAME: collation_list
188 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
189
190 NAME: foreign_key_list
drhf63936e2013-10-03 14:08:07 +0000191 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000192 IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
193
194 NAME: foreign_key_check
drhf63936e2013-10-03 14:08:07 +0000195 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000196 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
197
198 NAME: parser_trace
199 IF: defined(SQLITE_DEBUG)
200
201 NAME: case_sensitive_like
202
203 NAME: integrity_check
drhf63936e2013-10-03 14:08:07 +0000204 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000205 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
206
207 NAME: quick_check
208 TYPE: INTEGRITY_CHECK
drhf63936e2013-10-03 14:08:07 +0000209 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000210 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
211
212 NAME: encoding
213 IF: !defined(SQLITE_OMIT_UTF16)
214
215 NAME: schema_version
216 TYPE: HEADER_VALUE
217 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
218
219 NAME: user_version
220 TYPE: HEADER_VALUE
221 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
222
223 NAME: freelist_count
224 TYPE: HEADER_VALUE
225 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
226
227 NAME: application_id
228 TYPE: HEADER_VALUE
229 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
230
231 NAME: compile_options
232 IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
233
234 NAME: wal_checkpoint
drhf63936e2013-10-03 14:08:07 +0000235 FLAG: NeedSchema
drh9ccd8652013-09-13 16:36:46 +0000236 IF: !defined(SQLITE_OMIT_WAL)
237
238 NAME: wal_autocheckpoint
239 IF: !defined(SQLITE_OMIT_WAL)
240
241 NAME: shrink_memory
242
243 NAME: busy_timeout
244
245 NAME: lock_status
246 IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
247
248 NAME: key
249 IF: defined(SQLITE_HAS_CODEC)
250
251 NAME: rekey
252 IF: defined(SQLITE_HAS_CODEC)
253
254 NAME: hexkey
255 IF: defined(SQLITE_HAS_CODEC)
256
drh8ab88322013-10-07 00:36:01 +0000257 NAME: hexrekey
258 TYPE: HEXKEY
259 IF: defined(SQLITE_HAS_CODEC)
260
drh9ccd8652013-09-13 16:36:46 +0000261 NAME: activate_extensions
262 IF: defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD)
drh55e85ca2013-09-13 21:01:56 +0000263
264 NAME: soft_heap_limit
drh9ccd8652013-09-13 16:36:46 +0000265}
266set name {}
267set type {}
268set if {}
drhf63936e2013-10-03 14:08:07 +0000269set flags {}
drh9ccd8652013-09-13 16:36:46 +0000270set arg 0
271proc record_one {} {
drhf63936e2013-10-03 14:08:07 +0000272 global name type if arg allbyname typebyif flags
drh9ccd8652013-09-13 16:36:46 +0000273 if {$name==""} return
drhf63936e2013-10-03 14:08:07 +0000274 set allbyname($name) [list $type $arg $if $flags]
drh9ccd8652013-09-13 16:36:46 +0000275 set name {}
276 set type {}
277 set if {}
drhf63936e2013-10-03 14:08:07 +0000278 set flags {}
drh9ccd8652013-09-13 16:36:46 +0000279 set arg 0
280}
281foreach line [split $pragma_def \n] {
282 set line [string trim $line]
283 if {$line==""} continue
284 foreach {id val} [split $line :] break
285 set val [string trim $val]
286 if {$id=="NAME"} {
287 record_one
288 set name $val
289 set type [string toupper $val]
290 } elseif {$id=="TYPE"} {
291 set type $val
292 } elseif {$id=="ARG"} {
293 set arg $val
294 } elseif {$id=="IF"} {
295 set if $val
drhf63936e2013-10-03 14:08:07 +0000296 } elseif {$id=="FLAG"} {
297 foreach term [split $val] {
298 lappend flags $term
299 set allflags($term) 1
300 }
drh9ccd8652013-09-13 16:36:46 +0000301 } else {
302 error "bad pragma_def line: $line"
303 }
304}
305record_one
306set allnames [lsort [array names allbyname]]
307
308# Generate #defines for all pragma type names. Group the pragmas that are
309# omit in default builds (defined(SQLITE_DEBUG) and defined(SQLITE_HAS_CODEC))
310# at the end.
311#
312set pnum 0
313foreach name $allnames {
314 set type [lindex $allbyname($name) 0]
315 if {[info exists seentype($type)]} continue
316 set if [lindex $allbyname($name) 2]
317 if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
318 set seentype($type) 1
319 puts [format {#define %-35s %4d} PragTyp_$type $pnum]
320 incr pnum
321}
322foreach name $allnames {
323 set type [lindex $allbyname($name) 0]
324 if {[info exists seentype($type)]} continue
325 set if [lindex $allbyname($name) 2]
326 if {[regexp SQLITE_DEBUG $if]} continue
327 set seentype($type) 1
328 puts [format {#define %-35s %4d} PragTyp_$type $pnum]
329 incr pnum
330}
331foreach name $allnames {
332 set type [lindex $allbyname($name) 0]
333 if {[info exists seentype($type)]} continue
334 set seentype($type) 1
335 puts [format {#define %-35s %4d} PragTyp_$type $pnum]
336 incr pnum
337}
338
drhf63936e2013-10-03 14:08:07 +0000339# Generate #defines for flags
340#
341set fv 1
342foreach f [lsort [array names allflags]] {
343 puts [format {#define PragFlag_%-20s 0x%02x} $f $fv]
344 set fv [expr {$fv*2}]
345}
346
drh9ccd8652013-09-13 16:36:46 +0000347# Generate the lookup table
348#
349puts "static const struct sPragmaNames \173"
drh77ff23f2013-09-13 21:03:45 +0000350puts " const char *const zName; /* Name of pragma */"
drhd49c3582013-09-13 19:00:06 +0000351puts " u8 ePragTyp; /* PragTyp_XXX value */"
drhf63936e2013-10-03 14:08:07 +0000352puts " u8 mPragFlag; /* Zero or more PragFlag_XXX values */"
drh9ccd8652013-09-13 16:36:46 +0000353puts " u32 iArg; /* Extra argument */"
354puts "\175 aPragmaNames\[\] = \173"
355
356set current_if {}
357set spacer [format { %26s } {}]
358foreach name $allnames {
drhf63936e2013-10-03 14:08:07 +0000359 foreach {type arg if flag} $allbyname($name) break
drh9ccd8652013-09-13 16:36:46 +0000360 if {$if!=$current_if} {
361 if {$current_if!=""} {puts "#endif"}
362 set current_if $if
363 if {$current_if!=""} {puts "#if $current_if"}
364 }
drh9ccd8652013-09-13 16:36:46 +0000365 set typex [format PragTyp_%-23s $type,]
drhf63936e2013-10-03 14:08:07 +0000366 if {$flag==""} {
367 set flagx "0"
drh9ccd8652013-09-13 16:36:46 +0000368 } else {
drhf63936e2013-10-03 14:08:07 +0000369 set flagx PragFlag_[join $flag {|PragFlag_}]
drh9ccd8652013-09-13 16:36:46 +0000370 }
drhf63936e2013-10-03 14:08:07 +0000371 puts " \173 /* zName: */ \"$name\","
372 puts " /* ePragTyp: */ PragTyp_$type,"
373 puts " /* ePragFlag: */ $flagx,"
374 puts " /* iArg: */ $arg \175,"
drh9ccd8652013-09-13 16:36:46 +0000375}
376if {$current_if!=""} {puts "#endif"}
377puts "\175;"
drh6bb64f62013-09-13 16:56:17 +0000378
379# count the number of pragmas, for information purposes
380#
381set allcnt 0
382set dfltcnt 0
383foreach name $allnames {
384 incr allcnt
385 set if [lindex $allbyname($name) 2]
386 if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
387 incr dfltcnt
388}
389puts "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"