1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
<!DOCTYPE html>
<html><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="../sqlite.css" rel="stylesheet">
<title>SQLite Release 3.38.4 On 2022-05-04</title>
<!-- path=../ -->
</head>
<body>
<div class=nosearch>
<a href="../index.html">
<img class="logo" src="../images/sqlite370_banner.gif" alt="SQLite" border="0">
</a>
<div><!-- IE hack to prevent disappearing logo --></div>
<div class="tagline desktoponly">
Small. Fast. Reliable.<br>Choose any three.
</div>
<div class="menu mainmenu">
<ul>
<li><a href="../index.html">Home</a>
<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
<li class='wideonly'><a href='../about.html'>About</a>
<li class='desktoponly'><a href="../docs.html">Documentation</a>
<li class='desktoponly'><a href="../download.html">Download</a>
<li class='wideonly'><a href='../copyright.html'>License</a>
<li class='desktoponly'><a href="../support.html">Support</a>
<li class='desktoponly'><a href="../prosupport.html">Purchase</a>
<li class='search' id='search_menubutton'>
<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
</ul>
</div>
<div class="menu submenu" id="submenu">
<ul>
<li><a href='../about.html'>About</a>
<li><a href='../docs.html'>Documentation</a>
<li><a href='../download.html'>Download</a>
<li><a href='../support.html'>Support</a>
<li><a href='../prosupport.html'>Purchase</a>
</ul>
</div>
<div class="searchmenu" id="searchmenu">
<form method="GET" action="../search">
<select name="s" id="searchtype">
<option value="d">Search Documentation</option>
<option value="c">Search Changelog</option>
</select>
<input type="text" name="q" id="searchbox" value="">
<input type="submit" value="Go">
</form>
</div>
</div>
<script>
function toggle_div(nm) {
var w = document.getElementById(nm);
if( w.style.display=="block" ){
w.style.display = "none";
}else{
w.style.display = "block";
}
}
function toggle_search() {
var w = document.getElementById("searchmenu");
if( w.style.display=="block" ){
w.style.display = "none";
} else {
w.style.display = "block";
setTimeout(function(){
document.getElementById("searchbox").focus()
}, 30);
}
}
function div_off(nm){document.getElementById(nm).style.display="none";}
window.onbeforeunload = function(e){div_off("submenu");}
/* Disable the Search feature if we are not operating from CGI, since */
/* Search is accomplished using CGI and will not work without it. */
if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
document.getElementById("search_menubutton").style.display = "none";
}
/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
function hideorshow(btn,obj){
var x = document.getElementById(obj);
var b = document.getElementById(btn);
if( x.style.display!='none' ){
x.style.display = 'none';
b.innerHTML='show';
}else{
x.style.display = '';
b.innerHTML='hide';
}
return false;
}
var antiRobot = 0;
function antiRobotGo(){
if( antiRobot!=3 ) return;
antiRobot = 7;
var j = document.getElementById("mtimelink");
if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href");
}
function antiRobotDefense(){
document.body.onmousedown=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousedown=null;
}
document.body.onmousemove=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousemove=null;
}
setTimeout(function(){
antiRobot |= 1;
antiRobotGo();
}, 100)
antiRobotGo();
}
antiRobotDefense();
</script>
<h2>SQLite Release 3.38.4 On 2022-05-04</h2><p><b>Prior changes from version 3.38.0 (2022-02-22):</b></p>
<p><ol class='lessindent'>
<li value='1'> Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
The new operators are compatible with MySQL and PostgreSQL.
<li> The JSON functions are now built-ins. It is no longer necessary
to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
support. JSON is on by default. Disable the JSON interface using
the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
<li> Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
<ol type="a">
<li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
<li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
</ol>
<li> Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
compatibility. The original printf() name is retained as an alias
for backwards compatibility.
<li> Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
help to localize an SQL error to a specific character in the input
SQL text, so that applications can provide better error messages.
<li> Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
<ol type="a">
<li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
<li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
<li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
<li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
rather than processing each value of the right-hand side of the
IN operator separately.
</ol>
<li> <a href="../cli.html">CLI</a> enhancements:
<ol type="a">
<li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
and newlines embedded in text.
<li> Added options like "--wrap N", "--wordwrap on", and "--quote"
to the <a href="../cli.html#clmnr">columnar output modes</a>.
<li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
<li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
<li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
error messages.
</ol>
<li> Query planner enhancements:
<ol type="a">
<li> Use a Bloom filter to speed up large analytic queries.
<li> Use a balanced merge tree to evaluate UNION or UNION ALL
compound SELECT statements that have an ORDER BY clause.
</ol>
<li> The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
<a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
</ol>
<p><b>Prior changes from version 3.38.1 (2022-03-12):</b></p>
<p><ol class='lessindent'>
<li value='10'> Fix problems with the new Bloom filter optimization that might cause
some obscure queries to get an incorrect answer.
<li> Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
it preserves fractional seconds.
<li> Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
in corner cases such as when the argument is a virtual column or the
column of a view.
<li> Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
work correctly even if the virtual table implementation relies on bytecode
to filter rows that do not satisfy the constraint.
<li> Other minor fixes to assert() statements, test cases, and documentation.
See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
for details.
</ol>
<p><b>Prior changes from version 3.38.2 (2022-03-26):</b></p>
<p><ol class='lessindent'>
<li value='15'> Fix a user-discovered problem with the new Bloom filter optimization
that might cause an incorrect answer when doing a LEFT JOIN with a WHERE
clause constraint that says that one of the columns on the right table of
the LEFT JOIN is NULL. See
<a href='https://sqlite.org/forum/forumpost/031e262a89b6a9d2'>forum thread 031e262a89b6a9d2</a>.
<li> Other minor patches. See the
<a href='https://sqlite.org/src/timeline?p=version-3.38.2&bt=version-3.38.1'>timeline</a> for
details.
</ol>
<p><b>Prior changes from version 3.38.3 (2022-04-27):</b></p>
<p><ol class='lessindent'>
<li value='17'> Fix a case of the query planner be overly aggressive with optimizing automatic-index
and Bloom-filter construction, using inappropriate ON clause terms to restrict the
size of the automatic-index or Bloom filter, and resulting in missing rows in the
output.
<a href='https://sqlite.org/forum/forumpost/0d3200f4f3bcd3a3'>Forum thread 0d3200f4f3bcd3a3</a>.
<li> Other minor patches. See the
<a href='https://sqlite.org/src/timeline?p=version-3.38.3&bt=version-3.38.2'>timeline</a> for
details.
</ol>
<p><b>Changes in this specific patch release, version 3.38.4 (2022-05-04):</b></p>
<p><ol class='lessindent'>
<li value='19'> Fix a byte-code problem in the Bloom filter pull-down optimization added by release
3.38.0 in which an error in the byte code causes the byte code engine to enter an
infinite loop when the pull-down optimization encounters a NULL key.
<a href='https://sqlite.org/forum/forumpost/2482b32700384a0f'>Forum thread 2482b32700384a0f</a>.
<li> Other minor patches. See the
<a href='https://sqlite.org/src/timeline?p=branch-3.38&bt=version-3.38.3'>timeline</a> for
details.
<p><b>Hashes:</b>
<li>SQLITE_SOURCE_ID: 2022-05-04 15:45:55 d402f49871152670a62f4f28cacb15d814f2c1644e9347ad7d258e562978e45e
<li>SHA3-256 for sqlite3.c: e6a50effb021858c200e885664611ed3c5e949413ff2dca452ac7ee336b9de1d
</ol></p>
<p>A <a href="../changes.html">complete list of SQLite releases</a>
in a single page and a <a href="../chronology.html">chronology</a> are both also available.
A detailed history of every
check-in is available at
<a href="https://www.sqlite.org/src/timeline">
SQLite version control site</a>.</p>
|