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
233
234
235
236
237
238
239
240
241
|
<!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.23.1 On 2018-04-10</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.23.1 On 2018-04-10</h2><p><b>Prior changes from version 3.23.0 (2018-04-02):</b></p>
<p><ol class='lessindent'>
<li value='1'> Add the <a href="../c3ref/serialize.html">sqlite3_serialize()</a> and <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interfaces when
the <a href="../compile.html#enable_deserialize">SQLITE_ENABLE_DESERIALIZE</a> compile-time option is used.
<li> Recognize TRUE and FALSE as constants. (For compatibility, if there
exist columns named "true" or "false", then the identifiers refer to the
columns rather than Boolean constants.)
<li> Support operators IS TRUE, IS FALSE, IS NOT TRUE, and IS NOT FALSE.
<li> Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachespill">SQLITE_DBSTATUS_CACHE_SPILL</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a> for
reporting the number of cache spills that have occurred.
<li> The "alternate-form-2" flag ("!") on the <a href="../printf.html">built-in printf</a> implementation
now causes string substitutions to measure the width and precision in
characters instead of bytes.
<li> If the <a href="../vtab.html#xcolumn">xColumn</a> method in a <a href="../vtab.html">virtual table</a> implementation returns
an error message using <a href="../c3ref/result_blob.html">sqlite3_result_error()</a> then give that error
message preference over internally-generated messages.
<li> Added the -A command-line option to the <a href="../cli.html">CLI</a> to make it easier to manage
<a href="../sqlar.html">SQLite Archive files</a>.
<li> Add support for INSERT OR REPLACE, INSERT OR IGNORE, and UPDATE OR REPLACE
in the <a href="../zipfile.html">Zipfile virtual table</a>.
<li> Enhance the <a href="../session/sqlite3changeset_apply.html">sqlite3changeset_apply()</a> interface so that it is hardened
against attacks from deliberately corrupted <a href="../sessionintro.html#changeset">changeset</a> objects.
<li> Added the <a href="https://sqlite.org/src/file/ext/misc/normalize.c">sqlite3_normalize()</a>
extension function.
<li> Query optimizer enhancements:
<ol type='a'>
<li> Improve the <a href="../optoverview.html#omitnoopjoin">omit-left-join optimization</a> so that it works in cases where
the right-hand table is UNIQUE but not necessarily NOT NULL.
<li> Improve the <a href="../optoverview.html#pushdown">push-down optimization</a> so that it works for many LEFT JOINs.
<li> Add the <a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> that converts a LEFT
JOIN into an ordinary JOIN if there exist terms in the WHERE clause
that would prevent the extra all-NULL row of the LEFT JOIN from
appearing in the output set.
<li> Avoid unnecessary writes to the sqlite_sequence table when an
<a href="../autoinc.html">AUTOINCREMENT</a> table is updated with an rowid that is less than the
maximum.
</ol>
<li> Bug fixes:
<ol type='a'>
<li> Fix the parser to accept valid <a href="../rowvalue.html">row value</a> syntax.
Ticket <a href="https://www.sqlite.org/src/info/7310e2fb3d046a5">7310e2fb3d046a5</a>
<li> Fix the query planner so that it takes into account dependencies in
the arguments to table-valued functions in subexpressions in
the WHERE clause.
Ticket <a href="https://www.sqlite.org/src/info/80177f0c226ff54">80177f0c226ff54</a>
<li> Fix incorrect result with complex OR-connected WHERE and STAT4.
Ticket <a href="https://www.sqlite.org/src/info/ec32177c99ccac2">ec32177c99ccac2</a>
<li> Fix potential corruption in <a href="../expridx.html">indexes on expressions</a> due to automatic
datatype conversions.
Ticket <a href="https://www.sqlite.org/src/info/343634942dd54ab">343634942dd54ab</a>
<li> Assertion fault in FTS4.
Ticket <a href="https://www.sqlite.org/src/info/d6ec09eccf68cfc">d6ec09eccf68cfc</a>
<li> Incorrect result on the less-than operator in <a href="../rowvalue.html">row values</a>.
Ticket <a href="https://www.sqlite.org/src/info/f484b65f3d62305">f484b65f3d62305</a>
<li> Always interpret non-zero floating-point values as TRUE, even if
the integer part is zero.
Ticket <a href="https://www.sqlite.org/src/info/36fae083b450e3a">36fae083b450e3a</a>
<li> Fix an issue in the fsdir(PATH) <a href="../vtab.html#tabfunc2">table-valued function</a> to the
<a href="https://sqlite.org/src/file/ext/misc/fileio.c">fileio.c</a> extension,
that caused a segfault if the fsdir() table was used as the inner table
of a join. Problem reported on the mailing list and fixed by check-in
<a href="https://www.sqlite.org/src/info/7ce4e71c1b7251be">7ce4e71c1b7251be</a>
<li> Issue an error rather instead of an assertion-fault or null-pointer
dereference when the sqlite_master table is corrupted so that the
sqlite_sequence table root page is really a btree-index page. Check-in
<a href="https://www.sqlite.org/src/info/525deb7a67fbd647">525deb7a67fbd647</a>
<li> Fix the <a href="../lang_analyze.html">ANALYZE</a> command so that it computes statistics on tables
whose names begin with "sqlite". Check-in
<a href="https://sqlite.org/src/info/0249d9aecf69948d">0249d9aecf69948d</a>
</ol>
<li> Additional fixes for issues detected by
<a href="https://github.com/google/oss-fuzz">OSSFuzz</a>:
<ol type='a'>
<li> Fix a possible infinite loop on VACUUM for corrupt database files.
Check-in <a href="https://www.sqlite.org/src/info/27754b74ddf64">27754b74ddf64</a>
<li> Disallow <a href="../lang_expr.html#varparam">parameters</a> in the <a href="../lang_with.html">WITH clause</a> of triggers and views.
Check-in <a href="https://www.sqlite.org/src/info/b918d4b4e546d">b918d4b4e546d</a>
<li> Fix a potential memory leak in <a href="../rowvalue.html">row value</a> processing.
Check-in <a href="https://www.sqlite.org/src/info/2df6bbf1b8ca8">2df6bbf1b8ca8</a>
<li> Improve the performance of the <a href="../lang_corefunc.html#replace">replace() SQL function</a> for cases where
there are many substitutions on megabyte-sized strings, in an attempt
to avoid OSSFuzz timeouts during testing.
Check-in <a href="https://www.sqlite.org/src/info/fab2c2b07b5d3">fab2c2b07b5d3</a>
<li> Provide an appropriate error message when the sqlite_master table
contains a CREATE TABLE AS statement. Formerly this caused either an
assertion fault or null pointer dereference. Problem found by OSSFuzz
on the GDAL project. Check-in
<a href="https://www.sqlite.org/src/info/d75e67654aa96">d75e67654aa96</a>
<li> Incorrect assert() statement removed. Check-in
<a href="https://www.sqlite.org/src/info/823779d31eb09cda">823779d31eb09cda</a>.
<li> Fix a problem with using the <a href="../optoverview.html#like_opt">LIKE optimization</a> on an
<a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>. Check-in
<a href="https://www.sqlite.org/src/info/b850dd159918af56">b850dd159918af56</a>.
</ol>
</ol>
<p><b>Changes in this specific patch release, version 3.23.1 (2018-04-10):</b></p>
<p><ol class='lessindent'>
<li value='14'> Fix two problems in the new <a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a>.
Tickets <a href="https://sqlite.org/src/info/1e39b966ae9ee739">1e39b966ae9ee739</a>
and <a href="https://sqlite.org/src/info/fac496b61722daf2">fac496b61722daf2</a>.
<li> Fix misbehavior of the FTS5 xBestIndex method. Ticket
<a href="https://sqlite.org/src/info/2b8aed9f7c9e61e8">2b8aed9f7c9e61e8</a>.
<li> Fix a harmless reference to an uninitialized virtual machine register.
Ticket <a href="https://sqlite.org/src/info/093420fc0eb7cba7">093420fc0eb7cba7</a>.
<li> Fix the <a href="../cli.html">CLI</a> so that it builds with -DSQLITE_UNTESTABLE
<li> Fix the <a href="https://sqlite.org/src/file/ext/misc/eval.c">eval.c</a> extension
so that it works with <a href="../pragma.html#pragma_empty_result_callbacks">PRAGMA empty_result_callbacks=ON</a>.
<li> Fix the <a href="../series.html">generate_series</a> virtual table so that it correctly returns
no rows if any of its constraints are NULL.
<li> Performance enhancements in the parser.
<p><b>Hashes:</b>
<li>SQLITE_SOURCE_ID: "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
<li>SHA3-256 for sqlite3.c: 65750d1e506f416a0b0b9dd22d171379679c733e3460549754dc68c92705b5dc
</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>
|