Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | Merge all changes needed for the SQLite core library 3.32.0 release. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
56170d1316782f1ba7b1813138919bdf |
User & Date: | mistachkin 2020-05-25 02:35:03.418 |
2020-05-25
| ||
22:39 | Update SQLite core library to the 3.32.1 release. check-in: fa6a9c03e2 user: mistachkin tags: trunk | |
02:35 | Merge all changes needed for the SQLite core library 3.32.0 release. check-in: 56170d1316 user: mistachkin tags: trunk | |
2020-05-24
| ||
23:07 | Update the expected results for the [71bedaca19] ticket test case. Closed-Leaf check-in: 5ae8a13833 user: mistachkin tags: core-3.32.0 | |
00:46 | Fix typos. check-in: 87a6f7b650 user: mistachkin tags: trunk | |
Changes to Doc/Extra/Core/images/syntax/insert-stmt.gif.
cannot compute difference between binary files
Changes to Doc/Extra/Core/lang.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
105 106 107 108 109 110 111 | <a href="syntaxdiagrams.html">syntax diagrams</a>. <p>The following syntax documentation topics are available:</p> <table width="100%" cellpadding="5" border="0"> <tr><td valign="top"><ul> | | < | < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < > > > | | | | | < < < < < < < < < < < < < < < < < | < < | < < < < < < < < < < < | < | 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 | <a href="syntaxdiagrams.html">syntax diagrams</a>. <p>The following syntax documentation topics are available:</p> <table width="100%" cellpadding="5" border="0"> <tr><td valign="top"><ul> <div class='columns' style='columns: 17em auto;'> <ul style='padding-top:0;'> <li><a href='lang_aggfunc.html'>aggregate functions</a></li> <li><a href='lang_altertable.html'>ALTER TABLE</a></li> <li><a href='lang_analyze.html'>ANALYZE</a></li> <li><a href='lang_attach.html'>ATTACH DATABASE</a></li> <li><a href=''>BEGIN TRANSACTION</a></li> <li><a href='lang_comment.html'>comment</a></li> <li><a href='lang_transaction.html'>COMMIT TRANSACTION</a></li> <li><a href='lang_corefunc.html'>core functions</a></li> <li><a href='lang_createindex.html'>CREATE INDEX</a></li> <li><a href='lang_createtable.html'>CREATE TABLE</a></li> <li><a href='lang_createtrigger.html'>CREATE TRIGGER</a></li> <li><a href='lang_createview.html'>CREATE VIEW</a></li> <li><a href='lang_createvtab.html'>CREATE VIRTUAL TABLE</a></li> <li><a href='lang_datefunc.html'>date and time functions</a></li> <li><a href='lang_delete.html'>DELETE</a></li> <li><a href='lang_detach.html'>DETACH DATABASE</a></li> <li><a href='lang_dropindex.html'>DROP INDEX</a></li> <li><a href='lang_droptable.html'>DROP TABLE</a></li> <li><a href='lang_droptrigger.html'>DROP TRIGGER</a></li> <li><a href='lang_dropview.html'>DROP VIEW</a></li> <li><a href='lang_transaction.html'>END TRANSACTION</a></li> <li><a href='lang_explain.html'>EXPLAIN</a></li> <li><a href='lang_expr.html'>expression</a></li> <li><a href='lang_indexedby.html'>INDEXED BY</a></li> <li><a href='lang_insert.html'>INSERT</a></li> <li><a href='lang_keywords.html'>keywords</a></li> <li><a href='lang_conflict.html'>ON CONFLICT clause</a></li> <li><a href='pragma.html#syntax'>PRAGMA</a></li> <li><a href='lang_reindex.html'>REINDEX</a></li> <li><a href='lang_savepoint.html'>RELEASE SAVEPOINT</a></li> <li><a href='lang_replace.html'>REPLACE</a></li> <li><a href='lang_transaction.html'>ROLLBACK TRANSACTION</a></li> <li><a href='lang_savepoint.html'>SAVEPOINT</a></li> <li><a href='lang_select.html'>SELECT</a></li> <li><a href='lang_update.html'>UPDATE</a></li> <li><a href='lang_upsert.html'>UPSERT</a></li> <li><a href='lang_vacuum.html'>VACUUM</a></li> <li><a href='lang_with.html'>WITH clause</a></li> </ul> </div> </ul></td></tr></table> <p>The routines <a href="c3ref/prepare.html">sqlite3_prepare_v2()</a>, <a href="c3ref/prepare.html">sqlite3_prepare()</a>, <a href="c3ref/prepare.html">sqlite3_prepare16()</a>, <a href="c3ref/prepare.html">sqlite3_prepare16_v2()</a>, <a href="c3ref/exec.html">sqlite3_exec()</a>, and <a href="c3ref/free_table.html">sqlite3_get_table()</a> accept an SQL statement list (sql-stmt-list) which is a semicolon-separated list of statements.</p> <p><b><a href="syntax/sql-stmt-list.html">sql-stmt-list:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram sql-stmt-list" src="images/syntax/sql-stmt-list.gif"></img> </div> <p>Each SQL statement in the statement list is an instance of the following:</p> <p><b><a href="syntax/sql-stmt.html">sql-stmt:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram sql-stmt" src="images/syntax/sql-stmt.gif"></img> </div> |
Changes to Doc/Extra/Core/lang_aggfunc.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Built-in Aggregate Functions</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | > | > | < < | | | | | | | | | < < < < < < < < < < < < < < < | < < < | | < < < < < < < < | < < < > > | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> Built-in Aggregate Functions </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/aggregate-function-invocation.html">aggregate-function-invocation:</a></b> <button id='x1191' onclick='hideorshow("x1191","x1192")'>hide</button></p> <div id='x1192' class='imgcontainer'> <img alt="syntax diagram aggregate-function-invocation" src="images/syntax/aggregate-function-invocation.gif" /> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1193' onclick='hideorshow("x1193","x1194")'>show</button></p> <div id='x1194' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1195' onclick='hideorshow("x1195","x1196")'>show</button></p> <div id='x1196' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1197' onclick='hideorshow("x1197","x1198")'>show</button></p> <div id='x1198' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1199' onclick='hideorshow("x1199","x1200")'>show</button></p> <div id='x1200' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1201' onclick='hideorshow("x1201","x1202")'>show</button></p> <div id='x1202' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1203' onclick='hideorshow("x1203","x1204")'>show</button></p> <div id='x1204' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1205' onclick='hideorshow("x1205","x1206")'>show</button></p> <div id='x1206' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1207' onclick='hideorshow("x1207","x1208")'>show</button></p> <div id='x1208' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1209' onclick='hideorshow("x1209","x1210")'>show</button></p> <div id='x1210' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1211' onclick='hideorshow("x1211","x1212")'>show</button></p> <div id='x1212' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1213' onclick='hideorshow("x1213","x1214")'>show</button></p> <div id='x1214' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1215' onclick='hideorshow("x1215","x1216")'>show</button></p> <div id='x1216' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1217' onclick='hideorshow("x1217","x1218")'>show</button></p> <div id='x1218' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1219' onclick='hideorshow("x1219","x1220")'>show</button></p> <div id='x1220' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1221' onclick='hideorshow("x1221","x1222")'>show</button></p> <div id='x1222' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1223' onclick='hideorshow("x1223","x1224")'>show</button></p> <div id='x1224' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1225' onclick='hideorshow("x1225","x1226")'>show</button></p> <div id='x1226' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1227' onclick='hideorshow("x1227","x1228")'>show</button></p> <div id='x1228' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1229' onclick='hideorshow("x1229","x1230")'>show</button></p> <div id='x1230' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1231' onclick='hideorshow("x1231","x1232")'>show</button></p> <div id='x1232' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> </div> <p> The aggregate functions shown below are available by default. Additional aggregate functions written in C may be added using the <a href="c3ref/create_function.html">sqlite3_create_function()</a> API.</p> <p> In any aggregate function that takes a single argument, that argument can be preceded by the keyword DISTINCT. In such cases, duplicate elements are filtered before being passed into the aggregate function. For example, the function "count(distinct X)" will return the number of distinct values of column X instead of the total number of non-null values in column X. </p> <a name="aggfilter"></a> <p> If a FILTER clause is provided, then only rows for which the <i>expr</i> is true are included in the aggregate. </p> <a name="aggfunclist"></a> <h1 id="list_of_built_in_aggregate_functions"><span>2. </span>List of built-in aggregate functions</h1> <div class='columns' style='columns: 11em auto;'> <ul style='padding-top:0;'> <li><a href='lang_aggfunc.html#avg'>avg(X)</a></li> <li><a href='lang_aggfunc.html#count'>count(*)</a></li> <li><a href='lang_aggfunc.html#count'>count(X)</a></li> <li><a href='lang_aggfunc.html#groupconcat'>group_concat(X)</a></li> <li><a href='lang_aggfunc.html#groupconcat'>group_concat(X,Y)</a></li> <li><a href='lang_corefunc.html#maxoreunc'>max(X)</a></li> <li><a href='lang_corefunc.html#minoreunc'>min(X)</a></li> <li><a href='lang_aggfunc.html#sumunc'>sum(X)</a></li> <li><a href='lang_aggfunc.html#sumunc'>total(X)</a></li> </ul> </div> <h1 id="descriptions_of_built_in_aggregate_functions"><span>3. </span>Descriptions of built-in aggregate functions</h1> <dl> <a name="avg"></a> <dt><p><b>avg(<i>X</i>)</b></dt><dd><p> The avg() function returns the average value of all non-NULL <i>X</i> within a group. String and BLOB values that do not look like numbers are interpreted as 0. The result of avg() is always a floating point value as long as |
336 337 338 339 340 341 342 343 344 | which might be an approximation to the true sum.</p> <p>Sum() will throw an "integer overflow" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation. Total() never throws an integer overflow. </dd> </dl> | > | 319 320 321 322 323 324 325 326 327 328 | which might be an approximation to the true sum.</p> <p>Sum() will throw an "integer overflow" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation. Total() never throws an integer overflow. </dd> </dl> |
Changes to Doc/Extra/Core/lang_altertable.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>ALTER TABLE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> ALTER TABLE </div> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/alter-table-stmt.html">alter-table-stmt:</a></b> <button id='x1233' onclick='hideorshow("x1233","x1234")'>hide</button></p> <div id='x1234' class='imgcontainer'> <img alt="syntax diagram alter-table-stmt" src="images/syntax/alter-table-stmt.gif" /> <p><b><a href="syntax/column-def.html">column-def:</a></b> <button id='x1235' onclick='hideorshow("x1235","x1236")'>show</button></p> <div id='x1236' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-def" src="images/syntax/column-def.gif" /> <p><b><a href="syntax/column-constraint.html">column-constraint:</a></b> <button id='x1237' onclick='hideorshow("x1237","x1238")'>show</button></p> <div id='x1238' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-constraint" src="images/syntax/column-constraint.gif" /> <p><b><a href="syntax/conflict-clause.html">conflict-clause:</a></b> <button id='x1239' onclick='hideorshow("x1239","x1240")'>show</button></p> <div id='x1240' style='display:none;' class='imgcontainer'> <img alt="syntax diagram conflict-clause" src="images/syntax/conflict-clause.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1241' onclick='hideorshow("x1241","x1242")'>show</button></p> <div id='x1242' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1243' onclick='hideorshow("x1243","x1244")'>show</button></p> <div id='x1244' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1245' onclick='hideorshow("x1245","x1246")'>show</button></p> <div id='x1246' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1247' onclick='hideorshow("x1247","x1248")'>show</button></p> <div id='x1248' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1249' onclick='hideorshow("x1249","x1250")'>show</button></p> <div id='x1250' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1251' onclick='hideorshow("x1251","x1252")'>show</button></p> <div id='x1252' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1253' onclick='hideorshow("x1253","x1254")'>show</button></p> <div id='x1254' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1255' onclick='hideorshow("x1255","x1256")'>show</button></p> <div id='x1256' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1257' onclick='hideorshow("x1257","x1258")'>show</button></p> <div id='x1258' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1259' onclick='hideorshow("x1259","x1260")'>show</button></p> <div id='x1260' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1261' onclick='hideorshow("x1261","x1262")'>show</button></p> <div id='x1262' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1263' onclick='hideorshow("x1263","x1264")'>show</button></p> <div id='x1264' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1265' onclick='hideorshow("x1265","x1266")'>show</button></p> <div id='x1266' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1267' onclick='hideorshow("x1267","x1268")'>show</button></p> <div id='x1268' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1269' onclick='hideorshow("x1269","x1270")'>show</button></p> <div id='x1270' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1271' onclick='hideorshow("x1271","x1272")'>show</button></p> <div id='x1272' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1273' onclick='hideorshow("x1273","x1274")'>show</button></p> <div id='x1274' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <p><b><a href="syntax/foreign-key-clause.html">foreign-key-clause:</a></b> <button id='x1275' onclick='hideorshow("x1275","x1276")'>show</button></p> <div id='x1276' style='display:none;' class='imgcontainer'> <img alt="syntax diagram foreign-key-clause" src="images/syntax/foreign-key-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1277' onclick='hideorshow("x1277","x1278")'>show</button></p> <div id='x1278' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1279' onclick='hideorshow("x1279","x1280")'>show</button></p> <div id='x1280' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1281' onclick='hideorshow("x1281","x1282")'>show</button></p> <div id='x1282' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1283' onclick='hideorshow("x1283","x1284")'>show</button></p> <div id='x1284' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> </div> <p>SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table, to rename a column within a table, or to add a new column to an existing table. <a name="altertabrename"></a> </p><h1 id="alter_table_rename"><span>2. </span>ALTER TABLE RENAME</h1> <p> The RENAME TO syntax changes the name of <span class='yyterm'>table-name</span> to <span class='yyterm'>new-table-name</span>. This command cannot be used to move a table between attached databases, only to rename a table within the same database. If the table being renamed has triggers or indices, then these remain attached to the table after it has been renamed. </p><blockquote style="'background-color:" #ffd0d0;'="1"> <b>Compatibility Note:</b> The behavior of ALTER TABLE when renaming a table was enhanced in versions 3.25.0 (2018-09-15) and 3.26.0 (2018-12-01) in order to carry the rename operation forward into triggers and views that reference the renamed table. This is considered an improvement. Applications that depend on the older (and arguably buggy) behavior can use the |
269 270 271 272 273 274 275 | <a href="pragma.html#pragma_legacy_alter_table">PRAGMA legacy_alter_table=ON</a> setting is engaged. The following table summaries the difference:</p> <blockquote> <table border="1" cellpadding="2" cellspacing="0"> <tr> <th>PRAGMA foreign_keys | | | | | | | | | | | | | | | | | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 | <a href="pragma.html#pragma_legacy_alter_table">PRAGMA legacy_alter_table=ON</a> setting is engaged. The following table summaries the difference:</p> <blockquote> <table border="1" cellpadding="2" cellspacing="0"> <tr> <th>PRAGMA foreign_keys </th><th>PRAGMA legacy_alter_table </th><th><a href="foreignkeys.html#parentchild">Parent Table</a> references are updated </th><th>SQLite version </th></tr><tr><td align="center">Off</td><td align="center">Off</td><td align="center">No</td><td align="center">< 3.26.0 </td></tr><tr><td align="center">Off</td><td align="center">Off</td><td align="center">Yes</td><td align="center">>= 3.26.0 </td></tr><tr><td align="center">On</td><td align="center">Off</td><td align="center">Yes</td><td align="center">all </td></tr><tr><td align="center">Off</td><td align="center">On</td><td align="center">No</td><td align="center">all </td></tr><tr><td align="center">On</td><td align="center">On</td><td align="center">Yes</td><td align="center">all </td></tr></table> </blockquote> <a name="altertabmvcol"></a> <h1 id="alter_table_rename_column"><span>3. </span>ALTER TABLE RENAME COLUMN</h1> <p> The RENAME COLUMN TO syntax changes the <span class='yyterm'>column-name</span> of table <span class='yyterm'>table-name</span> into <span class='yyterm'>new-column-name</span>. The column name is changed both within the table definition itself and also within all indexes, triggers, and views that reference the column. If the column name change would result in a semantic ambiguity in a trigger or view, then the RENAME COLUMN fails with an error and no changes are applied. <a name="altertabaddcol"></a> </p><h1 id="alter_table_add_column"><span>4. </span>ALTER TABLE ADD COLUMN</h1> <p> The ADD COLUMN syntax is used to add a new column to an existing table. The new column is always appended to the end of the list of existing columns. The <a href="syntax/column-def.html">column-def</a> rule defines the characteristics of the new column. The new column may take any of the forms permissible in a <a href="lang_createtable.html">CREATE TABLE</a> statement, with the following restrictions: </p><ul> <li>The column may not have a PRIMARY KEY or UNIQUE constraint.</li> <li>The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.</li> <li>If a NOT NULL constraint is specified, then the column must have a default value other than NULL. </li><li>If <a href="foreignkeys.html">foreign key constraints</a> are <a href="pragma.html#pragma_foreign_keys">enabled</a> and a column with a <a href="syntax/foreign-key-clause.html">REFERENCES clause</a> is added, the column must have a default value of NULL. </li><li>The column may not be <a href="gencol.html">GENERATED ALWAYS ... STORED</a>, though VIRTUAL columns are allowed. </li></ul> <p>Note also that when adding a <a href="lang_createtable.html#ckconst">CHECK constraint</a>, the CHECK constraint is not tested against preexisting rows of the table. This can result in a table that contains data that is in violation of the CHECK constraint. Future versions of SQLite might change to validate CHECK constraints as they are added.</p> |
336 337 338 339 340 341 342 | </p> <p>After ADD COLUMN has been run on a database, that database will not be readable by SQLite version 3.1.3 (2005-02-20) and earlier.</p> <a name="otheralter"></a> | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 | </p> <p>After ADD COLUMN has been run on a database, that database will not be readable by SQLite version 3.1.3 (2005-02-20) and earlier.</p> <a name="otheralter"></a> <h1 id="making_other_kinds_of_table_schema_changes"><span>5. </span>Making Other Kinds Of Table Schema Changes</h1> <p> The only schema altering commands directly supported by SQLite are the "<a href="lang_altertable.html#altertabrename">rename table</a>", "<a href="lang_altertable.html#altertabmvcol">rename column</a>", and "<a href="lang_altertable.html#altertabaddcol">add column</a>" commands shown above. However, applications can make other arbitrary changes to the format of a table using a simple sequence of operations. The steps to make arbitrary changes to the schema design of some table X are as follows: </p><ol> <li><p> If foreign key constraints are enabled, disable them using <a href="pragma.html#pragma_foreign_keys">PRAGMA foreign_keys=OFF</a>. </p></li><li><p> Start a transaction. </p></li><li><p> Remember the format of all indexes, triggers, and views associated with table X. This information will be needed in step 8 below. One way to do this is to run a query like the following: SELECT type, sql FROM sqlite_master WHERE tbl_name='X'. </p></li><li><p> Use <a href="lang_createtable.html">CREATE TABLE</a> to construct a new table "new_X" that is in the desired revised format of table X. Make sure that the name "new_X" does not collide with any existing table name, of course. </p></li><li><p> Transfer content from X into new_X using a statement like: INSERT INTO new_X SELECT ... FROM X. </p></li><li><p> Drop the old table X: <a href="lang_droptable.html">DROP TABLE X</a>. </p></li><li><p> Change the name of new_X to X using: ALTER TABLE new_X RENAME TO X. </p></li><li><p> Use <a href="lang_createindex.html">CREATE INDEX</a>, <a href="lang_createtrigger.html">CREATE TRIGGER</a>, and <a href="lang_createview.html">CREATE VIEW</a> to reconstruct indexes, triggers, and views associated with table X. Perhaps use the old format of the triggers, indexes, and views saved from step 3 above as a guide, making changes as appropriate for the alteration. </p></li><li><p>If any views refer to table X in a way that is affected by the schema change, then drop those views using <a href="lang_dropview.html">DROP VIEW</a> and recreate them with whatever changes are necessary to accommodate the schema change using <a href="lang_createview.html">CREATE VIEW</a>. </p></li><li><p> If foreign key constraints were originally enabled then run <a href="pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> to verify that the schema change did not break any foreign key constraints. </p></li><li><p> Commit the transaction started in step 2. </p></li><li><p> If foreign keys constraints were originally enabled, reenable them now. </p></li></ol> <a name="caution"></a> <p> <b>Caution:</b> Take care to follow the procedure above precisely. The boxes below summarize two procedures for modifying a table definition. At first glance, they both appear to accomplish the same thing. However, the procedure on the right does not always work, especially with the enhanced <a href="lang_altertable.html#altertabrename">rename table</a> capabilities added by versions 3.25.0 and 3.26.0. In the procedure on the right, the initial rename of the table to a temporary name might corrupt references to that table in triggers, views, and foreign key constraints. The safe procedure on the left constructs the revised table definition using a new temporary name, then renames the table into its final name, which does not break links. </p><center> <table border="1" cellpadding="10" cellspacing="0"> <tr> <td valign="top"> <ol> <li>Create new table </li><li>Copy data </li><li>Drop old table </li><li>Rename new into old </li></ol> </td><td valign="top"> <ol> <li>Rename old table </li><li>Create new table </li><li>Copy data </li><li>Drop old table </li></ol> </td></tr><tr> <th>↑<br>Correct </th><th>↑<br>Incorrect </th></tr></table> </center> <p>The 12-step <a href="lang_altertable.html#otheralter">generalized ALTER TABLE procedure</a> above will work even if the schema change causes the information stored in the table to change. So the full 12-step procedure above is appropriate for dropping a column, changing the order of columns, adding or removing a UNIQUE constraint or PRIMARY KEY, adding CHECK or FOREIGN KEY or NOT NULL constraints, or changing the datatype for a column, for example. However, a simpler and faster procedure can optionally be used for some changes that do no affect the on-disk content in any way. The following simpler procedure is appropriate for removing CHECK or FOREIGN KEY or NOT NULL constraints, or adding, removing, or changing default values on a column. </p><ol> <li><p> Start a transaction. </p></li><li><p> Run <a href="pragma.html#pragma_schema_version">PRAGMA schema_version</a> to determine the current schema version number. This number will be needed for step 6 below. </p></li><li><p> Activate schema editing using <a href="pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>. </p></li><li><p> Run an <a href="lang_update.html">UPDATE</a> statement to change the definition of table X in the <a href="fileformat2.html#sqlite_master">sqlite_master table</a>: UPDATE sqlite_master SET sql=... WHERE type='table' AND name='X'; </p><p><em>Caution:</em> Making a change to the sqlite_master table like this will render the database corrupt and unreadable if the change contains a syntax error. It is suggested that careful testing of the UPDATE statement be done on a separate blank database prior to using it on a database containing important data. </p></li><li><p> If the change to table X also affects other tables or indexes or triggers are views within schema, then run <a href="lang_update.html">UPDATE</a> statements to modify those other tables indexes and views too. For example, if the name of a column changes, all FOREIGN KEY constraints, triggers, indexes, and views that refer to that column must be modified. </p><p><em>Caution:</em> Once again, making changes to the sqlite_master table like this will render the database corrupt and unreadable if the change contains an error. Carefully test this entire procedure on a separate test database prior to using it on a database containing important data and/or make backup copies of important databases prior to running this procedure. </p></li><li><p> Increment the schema version number using <a href="pragma.html#pragma_schema_version">PRAGMA schema_version=X</a> where X is one more than the old schema version number found in step 2 above. </p></li><li><p> Disable schema editing using <a href="pragma.html#pragma_writable_schema">PRAGMA writable_schema=OFF</a>. </p></li><li><p> (Optional) Run <a href="pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> to verify that the schema changes did not damage the database. </p></li><li><p> Commit the transaction started on step 1 above. </p></li></ol> <p>If some future version of SQLite adds new ALTER TABLE capabilities, those capabilities will very likely use one of the two procedures outlined above. <a name="altertableishard"></a> </p><h1 id="why_alter_table_is_such_a_problem_for_sqlite"><span>6. </span>Why ALTER TABLE is such a problem for SQLite</h1> <p>Most SQL database engines store the schema already parsed into various system tables. On those database engines, ALTER TABLE merely has to make modifications to the corresponding system tables. </p><p>SQLite is different in that it stores the schema in the <a href="fileformat2.html#sqlite_master">sqlite_master</a> table as the original text of the CREATE statements that define the schema. Hence ALTER TABLE needs to revise the text of the CREATE statement. Doing so can be tricky for certain "creative" schema designs. </p><p>The SQLite approach of storing the schema as text has advantages for an embedded relational database. For one, it means that the schema takes up less space in the database file. This is important since a common SQLite usage pattern is to have many small, separate database files instead of putting everything in one big global database file, which is the usual approach for client/server database engines. Since the schema is duplicated in each separate database file, it is important to keep the schema representation compact. </p><p>Storing the schema as text rather than as parsed tables also give flexibility to the implementation. Since the internal parse of the schema is regenerated each time the database is opened, the internal representation of the schema can change from one release to the next. This is important, as sometimes new features require enhancements to the internal schema representation. Changing the internal schema representation would be much more difficult if the schema representation was exposed in the database file. So, in other words, storing the schema as text helps maintain backwards compatibility, and helps ensure that older database files can be read and written by newer versions of SQLite. </p><p>Storing the schema a text also makes the <a href="fileformat2.html">SQLite database file format</a> easier to define, document, and understand. This helps make SQLite database files a <a href="locrsf.html">recommended storage format</a> for long-term archiving of data. </p><p>The downside of storing schema a text is that it can make the schema tricky to modify. And for that reason, the ALTER TABLE support in SQLite has traditionally lagged behind other SQL database engines that store their schemas as parsed system tables that are easier to modify. </p> |
Changes to Doc/Extra/Core/lang_analyze.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>ANALYZE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > | < < < > | > | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> ANALYZE </div> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/analyze-stmt.html">analyze-stmt:</a></b> <button id='x1285' onclick='hideorshow("x1285","x1286")'>hide</button></p> <div id='x1286' class='imgcontainer'> <img alt="syntax diagram analyze-stmt" src="images/syntax/analyze-stmt.gif" /> </div> <p> The ANALYZE command gathers statistics about tables and indices and stores the collected information in <a href="fileformat2.html#intschema">internal tables</a> of the database where the query optimizer can access the information and use it to help make better query planning choices. If no arguments are given, all attached databases are analyzed. If a schema name is given as the argument, then all tables and indices in that one database are analyzed. If the argument is a table name, then only that table and the indices associated with that table are analyzed. If the argument is an index name, then only that one index is analyzed.</p> <a name="req"></a> <h2 id="recommended_usage_pattern"><span>1.1. </span>Recommended usage pattern</h2> <p>Applications with long-lived databases that use complex queries should consider running the following commands just prior to closing each database connection: </p><div class="codeblock"><pre>PRAGMA analysis_limit=400; PRAGMA optimize; </pre></div> <p>The <a href="pragma.html#pragma_optimize">optimize pragma</a> is usually a no-op but it will occasionally run ANALYZE if it seems like doing so will be useful to the query planner. The <a href="pragma.html#pragma_analysis_limit">analysis_limit pragma</a> limits the scope of any ANALYZE command that the <a href="pragma.html#pragma_optimize">optimize pragma</a> runs so that it does not consume too many CPU cycles. The constant "400" can be adjusted as needed. Values between 100 and 1000 work well for most applications. </p><h1 id="details"><span>2. </span>Details</h1> <p> The default implementation stores all statistics in a single table named "<a href="fileformat2.html#stat1tab">sqlite_stat1</a>". If SQLite is compiled with the <a href="compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a> option, then additional histogram data is collected and stored in <a href="fileformat2.html#stat4tab">sqlite_stat4</a>. Older versions of SQLite would make use of the <a href="fileformat2.html#stat2tab">sqlite_stat2</a> table or <a href="fileformat2.html#stat3tab">sqlite_stat3</a> table when compiled with <a href="compile.html#enable_stat2">SQLITE_ENABLE_STAT2</a> or <a href="compile.html#enable_stat3">SQLITE_ENABLE_STAT3</a>, but all recent versions of SQLite ignore the sqlite_stat2 and sqlite_stat3 tables. Future enhancements may create additional <a href="fileformat2.html#intschema">internal tables</a> with the same name pattern except with final digit larger than "4". All of these tables are collectively referred to as "statistics tables". </p> <p> The content of the statistics tables can be queried using <a href="lang_select.html">SELECT</a> |
149 150 151 152 153 154 155 | changes the statistics tables directly, SQLite will not immediately notice the changes. An application can force the query planner to reread the statistics tables by running <b>ANALYZE sqlite_master</b>. </p> <a name="autoanalyze"></a> | | | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | changes the statistics tables directly, SQLite will not immediately notice the changes. An application can force the query planner to reread the statistics tables by running <b>ANALYZE sqlite_master</b>. </p> <a name="autoanalyze"></a> <h1 id="automatically_running_analyze"><span>3. </span>Automatically Running ANALYZE</h1> <p>The <a href="pragma.html#pragma_optimize">PRAGMA optimize</a> command will automatically run ANALYZE on individual tables on an as-needed basis. The recommended practice is for applications to invoke the <a href="pragma.html#pragma_optimize">PRAGMA optimize</a> statement just before closing each database connection.</p> <p>Each SQLite <a href="c3ref/sqlite3.html">database connection</a> records cases when the query planner would |
184 185 186 187 188 189 190 | to run the suggested ANALYZE commands, perhaps after prompting the user for guidance.</p> <p>The <a href="pragma.html#pragma_optimize">PRAGMA optimize</a> command was first introduced with SQLite 3.18.0 (2017-03-28) and is a no-op for all prior releases of SQLite.</p> | > | > > > > > > > | > > | > > | > > > > > > > > > | > > > > | > > > > | > > > > > > > > > | > > > > > > > > > > > | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | to run the suggested ANALYZE commands, perhaps after prompting the user for guidance.</p> <p>The <a href="pragma.html#pragma_optimize">PRAGMA optimize</a> command was first introduced with SQLite 3.18.0 (2017-03-28) and is a no-op for all prior releases of SQLite.</p> <a name="approx"></a> <h1 id="approximate_analyze_for_large_databases"><span>4. </span>Approximate ANALYZE For Large Databases</h1> <p>By default, ANALYZE does a full scan of every index. This can be slow for large databases. So beginning with SQLite version 3.32.0 (2020-05-22), the <a href="pragma.html#pragma_analysis_limit">PRAGMA analysis_limit</a> command can be used to limit the amount of scanning performed by ANALYZE, and thus help ANALYZE to run faster, even on very large database files. We call this running an "approximate ANALYZE". </p><p>The recommended usage pattern for the <a href="pragma.html#pragma_analysis_limit">analysis_limit</a> pragma is like this: </p><div class="codeblock"><pre>PRAGMA analysis_limit=1000; </pre></div> <p>This pragma tells the ANALYZE command to start a full scan of the index as it normally would. But when the number of rows visited reaches 1000 (or whatever other limit is specified by the pragma), the ANALYZE command will begin taking actions to stop the scan. If the left-most column of the index has changed at least once during the previous 1000 steps, then the analysis stops immediately. But if the left-most column has always been the same, then ANALYZE skips ahead to the first entry with a different left-most column and reads an additional 1000 rows before terminating. </p><p>The details of the effects of the analysis limit described in the previous paragraph are subject to change in future versions of SQLite. But the core idea will remain the same. An analysis limit of N will strive to limit the number of rows visited in each index to approximately N. </p><p>Values of N between 100 and 1000 are recommended. Or, to disable the analysis limit, causing ANALYZE to do a complete scan of each index, set the analysis limit to 0. The default value for the analysis limit is 0 for backwards compatibility. </p><p>The values placed in the sqlite_stat1 table by an approximate ANALYZE are not exactly the same as what would be computed by an unrestricted analysis. But they are usually close enough. The index statistics in the sqlite_stat1 table are approximations in any case, so the fact that the results of an approximate ANALYZE are slightly different from a traditional full scan ANALYZE has little practical impact. It is possible to construct a pathological case where an approximate ANALYZE is noticeably inferior to a full-scan ANALYZE, but such cases rare in real-world problems. </p><p>A good rule of thumb seems to be to always set "PRAGMA analysis_limit=N" for N between 100 and 1000 prior to running either "ANALYZE" or "<a href="pragma.html#pragma_optimize">PRAGMA optimize</a>". The results are not quite as precise, but they are precise enough, and the fact that the results are computed so much faster means that developers are more likely to compute them. An approximate ANALYZE is better than not running ANALYZE at all. </p><h2 id="limitations_of_approximate_analyze"><span>4.1. </span>Limitations of approximate ANALYZE</h2> <p>The content in the sqlite_stat4 table cannot be computed with anything less than a full scan. Hence, if a non-zero analysis limit is specified, the sqlite_stat4 table is not computed. </p> |
Changes to Doc/Extra/Core/lang_attach.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>ATTACH DATABASE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> ATTACH DATABASE </div> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/attach-stmt.html">attach-stmt:</a></b> <button id='x1287' onclick='hideorshow("x1287","x1288")'>hide</button></p> <div id='x1288' class='imgcontainer'> <img alt="syntax diagram attach-stmt" src="images/syntax/attach-stmt.gif" /> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1289' onclick='hideorshow("x1289","x1290")'>show</button></p> <div id='x1290' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1291' onclick='hideorshow("x1291","x1292")'>show</button></p> <div id='x1292' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1293' onclick='hideorshow("x1293","x1294")'>show</button></p> <div id='x1294' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1295' onclick='hideorshow("x1295","x1296")'>show</button></p> <div id='x1296' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1297' onclick='hideorshow("x1297","x1298")'>show</button></p> <div id='x1298' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1299' onclick='hideorshow("x1299","x1300")'>show</button></p> <div id='x1300' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1301' onclick='hideorshow("x1301","x1302")'>show</button></p> <div id='x1302' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1303' onclick='hideorshow("x1303","x1304")'>show</button></p> <div id='x1304' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1305' onclick='hideorshow("x1305","x1306")'>show</button></p> <div id='x1306' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1307' onclick='hideorshow("x1307","x1308")'>show</button></p> <div id='x1308' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1309' onclick='hideorshow("x1309","x1310")'>show</button></p> <div id='x1310' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1311' onclick='hideorshow("x1311","x1312")'>show</button></p> <div id='x1312' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1313' onclick='hideorshow("x1313","x1314")'>show</button></p> <div id='x1314' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1315' onclick='hideorshow("x1315","x1316")'>show</button></p> <div id='x1316' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1317' onclick='hideorshow("x1317","x1318")'>show</button></p> <div id='x1318' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1319' onclick='hideorshow("x1319","x1320")'>show</button></p> <div id='x1320' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1321' onclick='hideorshow("x1321","x1322")'>show</button></p> <div id='x1322' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1323' onclick='hideorshow("x1323","x1324")'>show</button></p> <div id='x1324' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1325' onclick='hideorshow("x1325","x1326")'>show</button></p> <div id='x1326' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1327' onclick='hideorshow("x1327","x1328")'>show</button></p> <div id='x1328' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> </div> <p> The ATTACH DATABASE statement adds another database file to the current <a href="c3ref/sqlite3.html">database connection</a>. Database files that were previously attached can be removed using the <a href="lang_detach.html">DETACH DATABASE</a> command. </p><h1 id="details"><span>2. </span>Details</h1> <p>The filename for the database to be attached is the value of the expression that occurs before the AS keyword. The filename of the database follows the same semantics as the filename argument to <a href="c3ref/open.html">sqlite3_open()</a> and <a href="c3ref/open.html">sqlite3_open_v2()</a>; the special name "<a href="inmemorydb.html">:memory:</a>" results in an <a href="inmemorydb.html">in-memory database</a> and an empty string results in a new temporary database. The filename argument can be a <a href="uri.html">URI filename</a> if URI filename processing is enable on the database connection. The default behavior is for URI filenames to be disabled, however that might change in a future release of SQLite, so application developers are advised to plan accordingly. </p><p>The name that occurs after the AS keyword is the name of the database used internally by SQLite. The schema-names 'main' and 'temp' refer to the main database and the database used for temporary tables. The main and temp databases cannot be attached or detached.</p> <p> Tables in an attached database can be referred to using the syntax |
240 241 242 243 244 245 246 247 | some of those files might get the changes where others might not. </p> <p> There is a limit, set using <a href="c3ref/limit.html">sqlite3_limit()</a> and <a href="c3ref/c_limit_attached.html#sqlitelimitattached">SQLITE_LIMIT_ATTACHED</a>, to the number of databases that can be simultaneously attached to a single database connection.</p> | < | 253 254 255 256 257 258 259 260 | some of those files might get the changes where others might not. </p> <p> There is a limit, set using <a href="c3ref/limit.html">sqlite3_limit()</a> and <a href="c3ref/c_limit_attached.html#sqlitelimitattached">SQLITE_LIMIT_ATTACHED</a>, to the number of databases that can be simultaneously attached to a single database connection.</p> |
Changes to Doc/Extra/Core/lang_comment.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>SQL Comment Syntax</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> SQL Comment Syntax </div> </div> <p><b><a href="syntax/comment-syntax.html">comment-syntax:</a></b> <button id='x1329' onclick='hideorshow("x1329","x1330")'>hide</button></p> <div id='x1330' class='imgcontainer'> <img alt="syntax diagram comment-syntax" src="images/syntax/comment-syntax.gif" /> </div> <p>Comments are not SQL commands, but can occur within the text of SQL queries passed to <a href="c3ref/prepare.html">sqlite3_prepare_v2()</a> and related interfaces. Comments are treated as whitespace by the parser. |
114 115 116 117 118 119 120 121 | or until the end of input, whichever comes first. C-style comments can span multiple lines. </p> <p>Comments can appear anywhere whitespace can occur, including inside expressions and in the middle of other SQL statements. Comments do not nest. </p> | < < | 125 126 127 128 129 130 131 132 | or until the end of input, whichever comes first. C-style comments can span multiple lines. </p> <p>Comments can appear anywhere whitespace can occur, including inside expressions and in the middle of other SQL statements. Comments do not nest. </p> |
Changes to Doc/Extra/Core/lang_conflict.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>The ON CONFLICT Clause</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> The ON CONFLICT Clause </div> </div> <p><b><a href="syntax/conflict-clause.html">conflict-clause:</a></b> <button id='x1331' onclick='hideorshow("x1331","x1332")'>hide</button></p> <div id='x1332' class='imgcontainer'> <img alt="syntax diagram conflict-clause" src="images/syntax/conflict-clause.gif" /> </div> <p>The ON CONFLICT clause is a non-standard extension specific to SQLite that can appear in many other SQL commands. It is given its own section in this document because it is not part of standard SQL and therefore might not be familiar.</p> <p>The ON CONFLICT clause described here has been a part of SQLite since before version 3.0.0 (2004-06-18). The phrase "ON CONFLICT" is also part of <a href="lang_upsert.html">UPSERT</a>, which is an extension to <a href="lang_insert.html">INSERT</a> added in version 3.24.0 (2018-06-04). Do not confuse these two separate uses of the "ON CONFLICT" phrase. </p><p>The syntax for the ON CONFLICT clause is as shown above for the CREATE TABLE command. For the INSERT and UPDATE commands, the keywords "ON CONFLICT" are replaced by "OR" so that the syntax reads more naturally. For example, instead of "INSERT ON CONFLICT IGNORE" we have "INSERT OR IGNORE". The keywords change but the meaning of the clause is the same either way.</p> |
194 195 196 197 198 199 200 | <a href="pragma.html#pragma_recursive_triggers">recursive triggers</a> are enabled.</p> <p>The <a href="c3ref/update_hook.html">update hook</a> is not invoked for rows that are deleted by the REPLACE conflict resolution strategy. Nor does REPLACE increment the <a href="c3ref/changes.html">change counter</a>. The exceptional behaviors defined in this paragraph might change in a future release.</p> | | < | 204 205 206 207 208 209 210 211 212 213 214 215 216 | <a href="pragma.html#pragma_recursive_triggers">recursive triggers</a> are enabled.</p> <p>The <a href="c3ref/update_hook.html">update hook</a> is not invoked for rows that are deleted by the REPLACE conflict resolution strategy. Nor does REPLACE increment the <a href="c3ref/changes.html">change counter</a>. The exceptional behaviors defined in this paragraph might change in a future release.</p> </dd></dl> <p>The algorithm specified in the OR clause of an INSERT or UPDATE overrides any algorithm specified in a CREATE TABLE. If no algorithm is specified anywhere, the ABORT algorithm is used.</p> |
Changes to Doc/Extra/Core/lang_corefunc.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Built-In Scalar SQL Functions</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > > > > | | | < < | | | | | | | > | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < > > > > > > > > > > > > > | | | | | | | | | | < < < < < < < < < < < < < < < | < < < | | < < < < < < < < | < < < > > | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> Built-In Scalar SQL Functions </div> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p>The core functions shown below are available by default. <a href="lang_datefunc.html">Date & Time functions</a>, <a href="lang_aggfunc.html">aggregate functions</a>, <a href="windowfunctions.html#biwinfunc">window functions</a>, and <a href="json1.html">JSON functions</a> are documented separately. An application may define additional functions written in C and added to the database engine using the <a href="c3ref/create_function.html">sqlite3_create_function()</a> API.</p> <p> <div class='columns' style='columns: 15em auto;'> <ul style='padding-top:0;'> <li><a href='lang_corefunc.html#abs'>abs(X)</a></li> <li><a href='lang_corefunc.html#changes'>changes()</a></li> <li><a href='lang_corefunc.html#char'>char(X1,X2,...,XN)</a></li> <li><a href='lang_corefunc.html#coalesce'>coalesce(X,Y,...)</a></li> <li><a href='lang_corefunc.html#glob'>glob(X,Y)</a></li> <li><a href='lang_corefunc.html#hex'>hex(X)</a></li> <li><a href='lang_corefunc.html#ifnull'>ifnull(X,Y)</a></li> <li><a href='lang_corefunc.html#iif'>iif(X,Y,Z)</a></li> <li><a href='lang_corefunc.html#instr'>instr(X,Y)</a></li> <li><a href='lang_corefunc.html#last_insert_rowid'>last_insert_rowid()</a></li> <li><a href='lang_corefunc.html#length'>length(X)</a></li> <li><a href='lang_corefunc.html#like'>like(X,Y)</a></li> <li><a href='lang_corefunc.html#like'>like(X,Y,Z)</a></li> <li><a href='lang_corefunc.html#likelihood'>likelihood(X,Y)</a></li> <li><a href='lang_corefunc.html#likely'>likely(X)</a></li> <li><a href='lang_corefunc.html#load_extension'>load_extension(X)</a></li> <li><a href='lang_corefunc.html#load_extension'>load_extension(X,Y)</a></li> <li><a href='lang_corefunc.html#lower'>lower(X)</a></li> <li><a href='lang_corefunc.html#ltrim'>ltrim(X)</a></li> <li><a href='lang_corefunc.html#ltrim'>ltrim(X,Y)</a></li> <li><a href='lang_corefunc.html#maxoreunc'>max(X,Y,...)</a></li> <li><a href='lang_corefunc.html#minoreunc'>min(X,Y,...)</a></li> <li><a href='lang_corefunc.html#nullif'>nullif(X,Y)</a></li> <li><a href='lang_corefunc.html#printf'>printf(FORMAT,...)</a></li> <li><a href='lang_corefunc.html#quote'>quote(X)</a></li> <li><a href='lang_corefunc.html#random'>random()</a></li> <li><a href='lang_corefunc.html#randomblob'>randomblob(N)</a></li> <li><a href='lang_corefunc.html#replace'>replace(X,Y,Z)</a></li> <li><a href='lang_corefunc.html#round'>round(X)</a></li> <li><a href='lang_corefunc.html#round'>round(X,Y)</a></li> <li><a href='lang_corefunc.html#rtrim'>rtrim(X)</a></li> <li><a href='lang_corefunc.html#rtrim'>rtrim(X,Y)</a></li> <li><a href='lang_corefunc.html#soundex'>soundex(X)</a></li> <li><a href='lang_corefunc.html#sqlite_compileoption_get'>sqlite_compileoption_get(N)</a></li> <li><a href='lang_corefunc.html#sqlite_compileoption_used'>sqlite_compileoption_used(X)</a></li> <li><a href='lang_corefunc.html#sqlite_offset'>sqlite_offset(X)</a></li> <li><a href='lang_corefunc.html#sqlite_source_id'>sqlite_source_id()</a></li> <li><a href='lang_corefunc.html#sqlite_version'>sqlite_version()</a></li> <li><a href='lang_corefunc.html#substr'>substr(X,Y)</a></li> <li><a href='lang_corefunc.html#substr'>substr(X,Y,Z)</a></li> <li><a href='lang_corefunc.html#total_changes'>total_changes()</a></li> <li><a href='lang_corefunc.html#trim'>trim(X)</a></li> <li><a href='lang_corefunc.html#trim'>trim(X,Y)</a></li> <li><a href='lang_corefunc.html#typeof'>typeof(X)</a></li> <li><a href='lang_corefunc.html#unicode'>unicode(X)</a></li> <li><a href='lang_corefunc.html#unlikely'>unlikely(X)</a></li> <li><a href='lang_corefunc.html#upper'>upper(X)</a></li> <li><a href='lang_corefunc.html#zeroblob'>zeroblob(N)</a></li> </ul> </div> <h1 id="descriptions_of_built_in_scalar_sql_functions"><span>2. </span>Descriptions of built-in scalar SQL functions</h1> <dl> <a name="abs"></a> <dt><p><b>abs(<i>X</i>)</b></dt><dd><p> The abs(X) function returns the absolute value of the numeric argument X. Abs(X) returns NULL if X is NULL. Abs(X) returns 0.0 if X is a string or blob that cannot be converted to a numeric value. If X is the integer -9223372036854775808 then abs(X) throws an integer overflow |
239 240 241 242 243 244 245 246 247 248 249 250 251 252 | </dd> <a name="ifnull"></a> <dt><p><b>ifnull(<i>X</i>,<i>Y</i>)</b></dt><dd><p> The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. Ifnull() must have exactly 2 arguments. The ifnull() function is equivalent to <a href="lang_corefunc.html#coalesce">coalesce()</a> with two arguments. </dd> <a name="instr"></a> <dt><p><b>instr(<i>X</i>,<i>Y</i>)</b></dt><dd><p> The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. Or, if X and Y are both BLOBs, then instr(X,Y) returns one more than the number bytes prior to the first occurrence of Y, or 0 if | > > > > > > | 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | </dd> <a name="ifnull"></a> <dt><p><b>ifnull(<i>X</i>,<i>Y</i>)</b></dt><dd><p> The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. Ifnull() must have exactly 2 arguments. The ifnull() function is equivalent to <a href="lang_corefunc.html#coalesce">coalesce()</a> with two arguments. </dd> <a name="iif"></a> <dt><p><b>iif(<i>X</i>,<i>Y</i>,<i>Z</i>)</b></dt><dd><p> The iif(X,Y,Z) function returns the value Y if X is true, and Z otherwise. The iff(X,Y,Z) function is logically equivalent to and generates the same <a href="opcode.html">bytecode</a> as the <a href="lang_expr.html#case">CASE expression</a> "CASE WHEN X THEN Y ELSE Z END". </dd> <a name="instr"></a> <dt><p><b>instr(<i>X</i>,<i>Y</i>)</b></dt><dd><p> The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. Or, if X and Y are both BLOBs, then instr(X,Y) returns one more than the number bytes prior to the first occurrence of Y, or 0 if |
284 285 286 287 288 289 290 | reversed in the like() function relative to the infix <a href="lang_expr.html#like">LIKE</a> operator. X is the pattern and Y is the string to match against that pattern. Hence, the following expressions are equivalent: <blockquote><pre> name LIKE '%neon%' like('%neon%',name) </pre></blockquote> | | | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 | reversed in the like() function relative to the infix <a href="lang_expr.html#like">LIKE</a> operator. X is the pattern and Y is the string to match against that pattern. Hence, the following expressions are equivalent: <blockquote><pre> name LIKE '%neon%' like('%neon%',name) </pre></blockquote> <p>The <a href="c3ref/create_function.html">sqlite3_create_function()</a> interface can be used to override the like() function and thereby change the operation of the <a href="lang_expr.html#like">LIKE</a> operator. When overriding the like() function, it may be important to override both the two and three argument versions of the like() function. Otherwise, different code may be called to implement the <a href="lang_expr.html#like">LIKE</a> operator depending on whether or not an ESCAPE clause was specified. </dd> |
567 568 569 570 571 572 573 574 575 | The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. SQLite manages these zeroblobs very efficiently. Zeroblobs can be used to reserve space for a BLOB that is later written using <a href="c3ref/blob_open.html">incremental BLOB I/O</a>. This SQL function is implemented using the <a href="c3ref/result_blob.html">sqlite3_result_zeroblob()</a> routine from the C/C++ interface. </dd> </dl> | > | 556 557 558 559 560 561 562 563 564 565 | The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. SQLite manages these zeroblobs very efficiently. Zeroblobs can be used to reserve space for a BLOB that is later written using <a href="c3ref/blob_open.html">incremental BLOB I/O</a>. This SQL function is implemented using the <a href="c3ref/result_blob.html">sqlite3_result_zeroblob()</a> routine from the C/C++ interface. </dd> </dl> |
Changes to Doc/Extra/Core/lang_createindex.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>CREATE INDEX</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> CREATE INDEX </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/create-index-stmt.html">create-index-stmt:</a></b> <button id='x1333' onclick='hideorshow("x1333","x1334")'>hide</button></p> <div id='x1334' class='imgcontainer'> <img alt="syntax diagram create-index-stmt" src="images/syntax/create-index-stmt.gif" /> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1335' onclick='hideorshow("x1335","x1336")'>show</button></p> <div id='x1336' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1337' onclick='hideorshow("x1337","x1338")'>show</button></p> <div id='x1338' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1339' onclick='hideorshow("x1339","x1340")'>show</button></p> <div id='x1340' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1341' onclick='hideorshow("x1341","x1342")'>show</button></p> <div id='x1342' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1343' onclick='hideorshow("x1343","x1344")'>show</button></p> <div id='x1344' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1345' onclick='hideorshow("x1345","x1346")'>show</button></p> <div id='x1346' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1347' onclick='hideorshow("x1347","x1348")'>show</button></p> <div id='x1348' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1349' onclick='hideorshow("x1349","x1350")'>show</button></p> <div id='x1350' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1351' onclick='hideorshow("x1351","x1352")'>show</button></p> <div id='x1352' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1353' onclick='hideorshow("x1353","x1354")'>show</button></p> <div id='x1354' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1355' onclick='hideorshow("x1355","x1356")'>show</button></p> <div id='x1356' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1357' onclick='hideorshow("x1357","x1358")'>show</button></p> <div id='x1358' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1359' onclick='hideorshow("x1359","x1360")'>show</button></p> <div id='x1360' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1361' onclick='hideorshow("x1361","x1362")'>show</button></p> <div id='x1362' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1363' onclick='hideorshow("x1363","x1364")'>show</button></p> <div id='x1364' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1365' onclick='hideorshow("x1365","x1366")'>show</button></p> <div id='x1366' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1367' onclick='hideorshow("x1367","x1368")'>show</button></p> <div id='x1368' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1369' onclick='hideorshow("x1369","x1370")'>show</button></p> <div id='x1370' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1371' onclick='hideorshow("x1371","x1372")'>show</button></p> <div id='x1372' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1373' onclick='hideorshow("x1373","x1374")'>show</button></p> <div id='x1374' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/indexed-column.html">indexed-column:</a></b> <button id='x1375' onclick='hideorshow("x1375","x1376")'>show</button></p> <div id='x1376' style='display:none;' class='imgcontainer'> <img alt="syntax diagram indexed-column" src="images/syntax/indexed-column.gif" /> </div> </div> <p>The CREATE INDEX command consists of the keywords "CREATE INDEX" followed by the name of the new index, the keyword "ON", the name of a previously created table that is to be indexed, and a parenthesized list of table column names and/or expressions that are used for the index key. If the optional WHERE clause is included, then the index is a "<a href="partialindex.html">partial index</a>". </p> <p>If the optional IF NOT EXISTS clause is present and another index with the same name already exists, then this command becomes a no-op.</p> <p>There are no arbitrary limits on the number of indices that can be attached to a single table. The number of columns in an index is limited to the value set by <a href="c3ref/limit.html">sqlite3_limit</a>(<a href="c3ref/c_limit_attached.html#sqlitelimitcolumn">SQLITE_LIMIT_COLUMN</a>,...).</p> <p>Indexes are removed with the <a href="lang_dropindex.html">DROP INDEX</a> command.</p> <a name="uniqueidx"></a> <h2 id="unique_indexes"><span>1.1. </span>Unique Indexes</h2> <p>If the UNIQUE keyword appears between CREATE and INDEX then duplicate index entries are not allowed. Any attempt to insert a duplicate entry will result in an error.</p> <p>For the purposes of unique indices, all NULL values are considered different from all other NULL values and are thus unique. This is one of the two possible interpretations of the SQL-92 standard (the language in the standard is ambiguous). The interpretation used by SQLite is the same and is the interpretation followed by PostgreSQL, MySQL, Firebird, and Oracle. Informix and Microsoft SQL Server follow the other interpretation of the standard, which is that all NULL values are equal to one another.</p> <a name="indexexpr"></a> <h2 id="indexes_on_expressions"><span>1.2. </span>Indexes on Expressions</h2> <p>Expressions in an index may not reference other tables and may not use subqueries nor functions whose result might change (ex: <a href="lang_corefunc.html#random">random()</a> or <a href="lang_corefunc.html#sqlite_version">sqlite_version()</a>). Expressions in an index may only refer to columns in the table that is being indexed. Indexes on expression will not work with versions of SQLite prior to <a href="releaselog/3_9_0.html">version 3.9.0</a> (2015-10-14). See the <a href="expridx.html">Indexes On Expressions</a> document for additional information about using general expressions in CREATE INDEX statements. <a name="descidx"></a> </p><h2 id="descending_indexes"><span>1.3. </span>Descending Indexes</h2> <p>Each column name or expression can be followed by one of the "ASC" or "DESC" keywords to indicate sort order. The sort order may or may not be ignored depending on the database file format, and in particular the <a href="fileformat2.html#schemaformat">schema format number</a>. The "legacy" schema format (1) ignores index sort order. The descending index schema format (4) takes index sort order into account. Only versions of SQLite 3.3.0 (2006-01-11) and later are able to understand the descending index format. For compatibility, version of SQLite between 3.3.0 and 3.7.9 use the legacy schema format by default. The newer schema format is used by default in version 3.7.10 (2012-01-16) and later. The <a href="pragma.html#pragma_legacy_file_format">legacy_file_format pragma</a> can be used to change set the specific behavior for any version of SQLite.</p> <h2 id="nulls_first_and_nulls_last"><span>1.4. </span>NULLS FIRST and NULLS LAST</h2> <p>The NULLS FIRST and NULLS LAST predicates are not supported for indexes. For <a href="datatype3.html#sortorder">sorting purposes</a>, SQLite considers NULL values to be smaller than all other values. Hence NULL values always appear at the beginning of an ASC index and at the end of a DESC index.</p> <a name="collidx"></a> <h2 id="collations"><span>1.5. </span>Collations</h2> <p>The COLLATE clause optionally following each column name or expression defines a collating sequence used for text entries in that column. The default collating sequence is the collating sequence defined for that column in the <a href="lang_createtable.html">CREATE TABLE</a> statement. Or if no collating sequence is otherwise defined, the built-in BINARY collating sequence is used.</p> |
Changes to Doc/Extra/Core/lang_createtable.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>CREATE TABLE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> CREATE TABLE </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#syntax">1. Syntax</a></div> <div class="fancy-toc1"><a href="#the_create_table_command">2. The CREATE TABLE command</a></div> <div class="fancy-toc2"><a href="#create_table_as_select_statements">2.1. CREATE TABLE ... AS SELECT Statements</a></div> <div class="fancy-toc1"><a href="#column_definitions">3. Column Definitions</a></div> <div class="fancy-toc2"><a href="#column_data_types">3.1. Column Data Types</a></div> <div class="fancy-toc2"><a href="#the_default_clause">3.2. The DEFAULT clause</a></div> <div class="fancy-toc2"><a href="#the_collate_clause">3.3. The COLLATE clause</a></div> <div class="fancy-toc2"><a href="#the_generated_always_as_clause">3.4. The GENERATED ALWAYS AS clause</a></div> <div class="fancy-toc2"><a href="#the_primary_key">3.5. The PRIMARY KEY</a></div> <div class="fancy-toc2"><a href="#unique_constraints">3.6. UNIQUE constraints</a></div> <div class="fancy-toc2"><a href="#check_constraints">3.7. CHECK constraints</a></div> <div class="fancy-toc2"><a href="#not_null_constraints">3.8. NOT NULL constraints</a></div> <div class="fancy-toc1"><a href="#constraint_violations">4. Constraint violations</a></div> <div class="fancy-toc1"><a href="#rowids_and_the_integer_primary_key">5. ROWIDs and the INTEGER PRIMARY KEY</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/create-table-stmt.html">create-table-stmt:</a></b> <button id='x1377' onclick='hideorshow("x1377","x1378")'>hide</button></p> <div id='x1378' class='imgcontainer'> <img alt="syntax diagram create-table-stmt" src="images/syntax/create-table-stmt.gif" /> <p><b><a href="syntax/column-def.html">column-def:</a></b> <button id='x1379' onclick='hideorshow("x1379","x1380")'>show</button></p> <div id='x1380' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-def" src="images/syntax/column-def.gif" /> <p><b><a href="syntax/column-constraint.html">column-constraint:</a></b> <button id='x1381' onclick='hideorshow("x1381","x1382")'>show</button></p> <div id='x1382' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-constraint" src="images/syntax/column-constraint.gif" /> <p><b><a href="syntax/conflict-clause.html">conflict-clause:</a></b> <button id='x1383' onclick='hideorshow("x1383","x1384")'>show</button></p> <div id='x1384' style='display:none;' class='imgcontainer'> <img alt="syntax diagram conflict-clause" src="images/syntax/conflict-clause.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1385' onclick='hideorshow("x1385","x1386")'>show</button></p> <div id='x1386' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1387' onclick='hideorshow("x1387","x1388")'>show</button></p> <div id='x1388' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1389' onclick='hideorshow("x1389","x1390")'>show</button></p> <div id='x1390' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1391' onclick='hideorshow("x1391","x1392")'>show</button></p> <div id='x1392' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1393' onclick='hideorshow("x1393","x1394")'>show</button></p> <div id='x1394' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1395' onclick='hideorshow("x1395","x1396")'>show</button></p> <div id='x1396' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> </div> <p><b><a href="syntax/foreign-key-clause.html">foreign-key-clause:</a></b> <button id='x1397' onclick='hideorshow("x1397","x1398")'>show</button></p> <div id='x1398' style='display:none;' class='imgcontainer'> <img alt="syntax diagram foreign-key-clause" src="images/syntax/foreign-key-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1399' onclick='hideorshow("x1399","x1400")'>show</button></p> <div id='x1400' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1401' onclick='hideorshow("x1401","x1402")'>show</button></p> <div id='x1402' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1403' onclick='hideorshow("x1403","x1404")'>show</button></p> <div id='x1404' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1405' onclick='hideorshow("x1405","x1406")'>show</button></p> <div id='x1406' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1407' onclick='hideorshow("x1407","x1408")'>show</button></p> <div id='x1408' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1409' onclick='hideorshow("x1409","x1410")'>show</button></p> <div id='x1410' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1411' onclick='hideorshow("x1411","x1412")'>show</button></p> <div id='x1412' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1413' onclick='hideorshow("x1413","x1414")'>show</button></p> <div id='x1414' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1415' onclick='hideorshow("x1415","x1416")'>show</button></p> <div id='x1416' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1417' onclick='hideorshow("x1417","x1418")'>show</button></p> <div id='x1418' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1419' onclick='hideorshow("x1419","x1420")'>show</button></p> <div id='x1420' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1421' onclick='hideorshow("x1421","x1422")'>show</button></p> <div id='x1422' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1423' onclick='hideorshow("x1423","x1424")'>show</button></p> <div id='x1424' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1425' onclick='hideorshow("x1425","x1426")'>show</button></p> <div id='x1426' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1427' onclick='hideorshow("x1427","x1428")'>show</button></p> <div id='x1428' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1429' onclick='hideorshow("x1429","x1430")'>show</button></p> <div id='x1430' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1431' onclick='hideorshow("x1431","x1432")'>show</button></p> <div id='x1432' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1433' onclick='hideorshow("x1433","x1434")'>show</button></p> <div id='x1434' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1435' onclick='hideorshow("x1435","x1436")'>show</button></p> <div id='x1436' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1437' onclick='hideorshow("x1437","x1438")'>show</button></p> <div id='x1438' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1439' onclick='hideorshow("x1439","x1440")'>show</button></p> <div id='x1440' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1441' onclick='hideorshow("x1441","x1442")'>show</button></p> <div id='x1442' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1443' onclick='hideorshow("x1443","x1444")'>show</button></p> <div id='x1444' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/table-constraint.html">table-constraint:</a></b> <button id='x1445' onclick='hideorshow("x1445","x1446")'>show</button></p> <div id='x1446' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-constraint" src="images/syntax/table-constraint.gif" /> <p><b><a href="syntax/conflict-clause.html">conflict-clause:</a></b> <button id='x1447' onclick='hideorshow("x1447","x1448")'>show</button></p> <div id='x1448' style='display:none;' class='imgcontainer'> <img alt="syntax diagram conflict-clause" src="images/syntax/conflict-clause.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1449' onclick='hideorshow("x1449","x1450")'>show</button></p> <div id='x1450' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1451' onclick='hideorshow("x1451","x1452")'>show</button></p> <div id='x1452' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1453' onclick='hideorshow("x1453","x1454")'>show</button></p> <div id='x1454' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1455' onclick='hideorshow("x1455","x1456")'>show</button></p> <div id='x1456' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1457' onclick='hideorshow("x1457","x1458")'>show</button></p> <div id='x1458' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1459' onclick='hideorshow("x1459","x1460")'>show</button></p> <div id='x1460' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1461' onclick='hideorshow("x1461","x1462")'>show</button></p> <div id='x1462' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1463' onclick='hideorshow("x1463","x1464")'>show</button></p> <div id='x1464' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1465' onclick='hideorshow("x1465","x1466")'>show</button></p> <div id='x1466' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/foreign-key-clause.html">foreign-key-clause:</a></b> <button id='x1467' onclick='hideorshow("x1467","x1468")'>show</button></p> <div id='x1468' style='display:none;' class='imgcontainer'> <img alt="syntax diagram foreign-key-clause" src="images/syntax/foreign-key-clause.gif" /> </div> <p><b><a href="syntax/indexed-column.html">indexed-column:</a></b> <button id='x1469' onclick='hideorshow("x1469","x1470")'>show</button></p> <div id='x1470' style='display:none;' class='imgcontainer'> <img alt="syntax diagram indexed-column" src="images/syntax/indexed-column.gif" /> </div> </div> </div> <h1 id="the_create_table_command"><span>2. </span>The CREATE TABLE command</h1> <p>The "CREATE TABLE" command is used to create a new table in an SQLite database. A CREATE TABLE command specifies the following attributes of the new table: </p><ul> <li><p>The name of the new table. </p></li><li><p> The database in which the new table is created. Tables may be created in the main database, the temp database, or in any attached database. </p></li><li><p> The name of each column in the table. </p></li><li><p> The declared type of each column in the table. </p></li><li><p> A default value or expression for each column in the table. </p></li><li><p> A default collation sequence to use with each column. </p></li><li><p> Optionally, a PRIMARY KEY for the table. Both single column and composite (multiple column) primary keys are supported. </p></li><li><p> A set of SQL constraints for each table. SQLite supports UNIQUE, NOT NULL, CHECK and FOREIGN KEY constraints. </p></li><li><p> Optionally, a <a href="gencol.html">generated column</a> constraint. </p></li><li><p> Whether the table is a <a href="withoutrowid.html">WITHOUT ROWID</a> table. </p></li></ul> <p>Every CREATE TABLE statement must specify a name for the new table. Table names that begin with "sqlite_" are reserved for internal use. It is an error to attempt to create a table with a name that starts with "sqlite_". </p><p> If a <span class='yyterm'>schema-name</span> is specified, it must be either "main", "temp", or the name of an <a href="lang_attach.html">attached database</a>. In this case the new table is created in the named database. If the "TEMP" or "TEMPORARY" keyword occurs between the "CREATE" and "TABLE" then the new table is created in the temp database. It is an error to specify both a <span class='yyterm'>schema-name</span> and the TEMP or TEMPORARY keyword, unless the <span class='yyterm'>schema-name</span> is "temp". If no schema name is specified and the TEMP keyword is not present then the table is created in the main database. </p><p> It is usually an error to attempt to create a new table in a database that already contains a table, index or view of the same name. However, if the "IF NOT EXISTS" clause is specified as part of the CREATE TABLE statement and a table or view of the same name already exists, the CREATE TABLE command simply has no effect (and no error message is returned). An error is still returned if the table cannot be created because of an existing index, even if the "IF NOT EXISTS" clause is specified. </p><p>It is not an error to create a table that has the same name as an existing <a href="lang_createtrigger.html">trigger</a>. </p><p>Tables are removed using the <a href="lang_droptable.html">DROP TABLE</a> statement. </p> <a name="createtabas"></a> <h2 id="create_table_as_select_statements"><span>2.1. </span>CREATE TABLE ... AS SELECT Statements</h2> <p>A "CREATE TABLE ... AS SELECT" statement creates and populates a database table based on the results of a SELECT statement. The table has the same number of columns as the rows returned by the SELECT statement. The name of each column is the same as the name of the corresponding column in the result set of the SELECT statement. The declared type of each column is determined by the <a href="datatype3.html#expraff">expression affinity</a> of the corresponding expression in the result set of the SELECT statement, as follows: </p> <center><table border="1"> <tr><th>Expression Affinity </th><th>Column Declared Type </th></tr><tr><td>TEXT </td><td>"TEXT" </td></tr><tr><td>NUMERIC </td><td>"NUM" </td></tr><tr><td>INTEGER </td><td>"INT" </td></tr><tr><td>REAL </td><td>"REAL" </td></tr><tr><td>BLOB (a.k.a "NONE") </td><td>"" (empty string) </td></tr></table></center> <p>A table created using CREATE TABLE AS has no PRIMARY KEY and no constraints of any kind. The default value of each column is NULL. The default collation sequence for each column of the new table is BINARY. </p><p>Tables created using CREATE TABLE AS are initially populated with the rows of data returned by the SELECT statement. Rows are assigned contiguously ascending <a href="lang_createtable.html#rowid">rowid</a> values, starting with 1, in the <a href="lang_select.html#orderby">order</a> that they are returned by the SELECT statement. <a name="tablecoldef"></a> </p><h1 id="column_definitions"><span>3. </span>Column Definitions</h1> <p>Unless it is a CREATE TABLE ... AS SELECT statement, a CREATE TABLE includes one or more <a href="syntax/column-def.html">column definitions</a>, optionally followed by a list of <a href="syntax/table-constraint.html">table constraints</a>. Each column definition consists of the name of the column, optionally followed by the declared type of the column, then one or more optional <a href="syntax/column-constraint.html">column constraints</a>. Included in the definition of "column constraints" for the purposes of the previous statement are the COLLATE and DEFAULT clauses, even though these are not really constraints in the sense that they do not restrict the data that the table may contain. The other constraints - NOT NULL, CHECK, UNIQUE, PRIMARY KEY and FOREIGN KEY constraints - impose restrictions on the table data. </p><p>The number of columns in a table is limited by the <a href="limits.html#max_column">SQLITE_MAX_COLUMN</a> compile-time parameter. A single row of a table cannot store more than <a href="limits.html#max_length">SQLITE_MAX_LENGTH</a> bytes of data. Both of these limits can be lowered at runtime using the <a href="c3ref/limit.html">sqlite3_limit()</a> C/C++ interface.</p> <h2 id="column_data_types"><span>3.1. </span>Column Data Types</h2> <p>Unlike most SQL databases, SQLite does not restrict the type of data that may be inserted into a column based on the columns declared type. Instead, SQLite uses <a href="datatype3.html">dynamic typing</a>. The declared type of a column is used to determine the <a href="datatype3.html#affinity">affinity</a> of the column only. <a name="dfltval"></a> </p><h2 id="the_default_clause"><span>3.2. </span>The DEFAULT clause</h2> <p>The DEFAULT clause specifies a default value to use for the column if no value is explicitly provided by the user when doing an <a href="lang_insert.html">INSERT</a>. If there is no explicit DEFAULT clause attached to a column definition, then the default value of the column is NULL. An explicit DEFAULT clause may specify that the default value is NULL, a string constant, a blob constant, a signed-number, or any constant expression enclosed in parentheses. A default value may also be one of the special case-independent keywords CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP. For the purposes of the DEFAULT clause, an expression is considered constant if it contains no sub-queries, column or table references, <a href="lang_expr.html#varparam">bound parameters</a>, or string literals enclosed in double-quotes instead of single-quotes. </p><p>Each time a row is inserted into the table by an INSERT statement that does not provide explicit values for all table columns the values stored in the new row are determined by their default values, as follows: </p><ul> <li><p>If the default value of the column is a constant NULL, text, blob or signed-number value, then that value is used directly in the new row. </p></li><li><p>If the default value of a column is an expression in parentheses, then the expression is evaluated once for each row inserted and the results used in the new row. </p></li><li><p>If the default value of a column is CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP, then the value used in the new row is a text representation of the current UTC date and/or time. For CURRENT_TIME, the format of the value is "HH:MM:SS". For CURRENT_DATE, "YYYY-MM-DD". The format for CURRENT_TIMESTAMP is "YYYY-MM-DD HH:MM:SS". </p></li></ul> <a name="collateclause"></a> <h2 id="the_collate_clause"><span>3.3. </span>The COLLATE clause</h2> <p>The COLLATE clause specifies the name of a <a href="datatype3.html#collation">collating sequence</a> to use as the default collation sequence for the column. If no COLLATE clause is specified, the default collation sequence is <a href="datatype3.html#collation">BINARY</a>. </p><h2 id="the_generated_always_as_clause"><span>3.4. </span>The GENERATED ALWAYS AS clause</h2> <p>A column that includes a GENERATED ALWAY AS clause is a <a href="gencol.html">generated column</a>. Generated columns are supported beginning with SQLite verison 3.31.0 (2020-01-22). See the <a href="gencol.html">separate documentation</a> for details on the capabilities and limitations of generated columns. <a name="primkeyconst"></a> </p><h2 id="the_primary_key"><span>3.5. </span>The PRIMARY KEY</h2> <p>Each table in SQLite may have at most one PRIMARY KEY. If the keywords PRIMARY KEY are added to a column definition, then the primary key for the table consists of that single column. Or, if a PRIMARY KEY clause is specified as a <a href="syntax/table-constraint.html">table-constraint</a>, then the primary key of the table consists of the list of columns specified as part of the PRIMARY KEY clause. The PRIMARY KEY clause must contain only column names — the use of expressions in an <a href="syntax/indexed-column.html">indexed-column</a> of a PRIMARY KEY is not supported. An error is raised if more than one PRIMARY KEY clause appears in a CREATE TABLE statement. The PRIMARY KEY is optional for ordinary tables but is required for <a href="withoutrowid.html">WITHOUT ROWID</a> tables. </p><p>If a table has a single column primary key and the declared type of that column is "INTEGER" and the table is not a <a href="withoutrowid.html">WITHOUT ROWID</a> table, then the column is known as an <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>. See <a href="lang_createtable.html#rowid">below</a> for a description of the special properties and behaviors associated with an <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>. </p><p>Each row in a table with a primary key must have a unique combination of values in its primary key columns. For the purposes of determining the uniqueness of primary key values, NULL values are considered distinct from all other values, including other NULLs. If an <a href="lang_insert.html">INSERT</a> or <a href="lang_update.html">UPDATE</a> statement attempts to modify the table content so that two or more rows have identical primary key values, that is a constraint violation. </p><p> According to the SQL standard, PRIMARY KEY should always imply NOT NULL. Unfortunately, due to a bug in some early versions, this is not the case in SQLite. Unless the column is an <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a> or the table is a <a href="withoutrowid.html">WITHOUT ROWID</a> table or the column is declared NOT NULL, SQLite allows NULL values in a PRIMARY KEY column. SQLite could be fixed to conform to the standard, but doing so might break legacy applications. Hence, it has been decided to merely document the fact that SQLite allowing NULLs in most PRIMARY KEY columns. <a name="uniqueconst"></a> </p><h2 id="unique_constraints"><span>3.6. </span>UNIQUE constraints</h2> <p>A UNIQUE constraint is similar to a PRIMARY KEY constraint, except that a single table may have any number of UNIQUE constraints. For each UNIQUE constraint on the table, each row must contain a unique combination of values in the columns identified by the UNIQUE constraint. For the purposes of UNIQUE constraints, NULL values are considered distinct from all other values, including other NULLs. As with PRIMARY KEYs, a UNIQUE <a href="syntax/table-constraint.html">table-constraint</a> clause must contain only column names — the use of expressions in an <a href="syntax/indexed-column.html">indexed-column</a> of a UNIQUE <a href="syntax/table-constraint.html">table-constraint</a> is not supported. </p><p>In most cases, UNIQUE and PRIMARY KEY constraints are implemented by creating a unique index in the database. (The exceptions are <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a> and PRIMARY KEYs on <a href="withoutrowid.html">WITHOUT ROWID</a> tables.) Hence, the following schemas are logically equivalent: </p><ol> <li><p>CREATE TABLE t1(a, b UNIQUE); </p></li><li><p>CREATE TABLE t1(a, b PRIMARY KEY); </p></li><li><p>CREATE TABLE t1(a, b);<br> CREATE UNIQUE INDEX t1b ON t1(b); </p></li></ol> <a name="ckconst"></a> <h2 id="check_constraints"><span>3.7. </span>CHECK constraints</h2> <p>A CHECK constraint may be attached to a column definition or specified as a table constraint. In practice it makes no difference. Each time a new row is inserted into the table or an existing row is updated, the expression associated with each CHECK constraint is evaluated and cast to a NUMERIC value in the same way as a <a href="lang_expr.html#castexpr">CAST expression</a>. If the result is zero (integer value 0 or real value 0.0), then a constraint violation has occurred. If the CHECK expression evaluates to NULL, or any other non-zero value, it is not a constraint violation. The expression of a CHECK constraint may not contain a subquery. <a name="notnullconst"></a> </p><h2 id="not_null_constraints"><span>3.8. </span>NOT NULL constraints</h2> <p>A NOT NULL constraint may only be attached to a column definition, not specified as a table constraint. Not surprisingly, a NOT NULL constraint dictates that the associated column may not contain a NULL value. Attempting to set the column value to NULL when inserting a new row or updating an existing one causes a constraint violation. </p><h1 id="constraint_violations"><span>4. </span>Constraint violations</h1> <p>Exactly how a constraint violation is dealt with is determined by the <a href="lang_conflict.html">constraint conflict resolution algorithm</a>. Each PRIMARY KEY, UNIQUE, NOT NULL and CHECK constraint has a default conflict resolution algorithm. PRIMARY KEY, UNIQUE and NOT NULL constraints may be explicitly assigned a default conflict resolution algorithm by including a <a href="syntax/conflict-clause.html">conflict-clause</a> in their definitions. Or, if a constraint definition does not include a <a href="syntax/conflict-clause.html">conflict-clause</a> or it is a CHECK constraint, the default conflict resolution algorithm is ABORT. Different constraints within the same table may have different default conflict resolution algorithms. See the section titled <a href="lang_conflict.html">ON CONFLICT</a> for additional information. <a name="rowid"></a> </p><h1 id="rowids_and_the_integer_primary_key"><span>5. </span>ROWIDs and the INTEGER PRIMARY KEY</h1> <p>Except for <a href="withoutrowid.html">WITHOUT ROWID</a> tables, all rows within SQLite tables have a 64-bit signed integer key that uniquely identifies the row within its table. This integer is usually called the "rowid". The rowid value can be accessed using one of the special case-independent names "rowid", "oid", or "_rowid_" in place of a column name. If a table contains a user defined column named "rowid", "oid" or "_rowid_", then that name always refers the explicitly declared column and cannot be used to retrieve the integer rowid value. </p><p>The rowid (and "oid" and "_rowid_") is omitted in <a href="withoutrowid.html">WITHOUT ROWID</a> tables. WITHOUT ROWID tables are only available in SQLite <a href="releaselog/3_8_2.html">version 3.8.2</a> (2013-12-06) and later. A table that lacks the WITHOUT ROWID clause is called a "rowid table". </p><p>The data for rowid tables is stored as a B-Tree structure containing one entry for each table row, using the rowid value as the key. This means that retrieving or sorting records by rowid is fast. Searching for a record with a specific rowid, or for all records with rowids within a specified range is around twice as fast as a similar search made by specifying any other PRIMARY KEY or indexed value. </p><p> With one exception noted below, if a rowid table has a primary key that consists of a single column and the declared type of that column is "INTEGER" in any mixture of upper and lower case, then the column becomes an alias for the rowid. Such a column is usually referred to as an "integer primary key". A PRIMARY KEY column only becomes an integer primary key if the declared type name is exactly "INTEGER". Other integer type names like "INT" or "BIGINT" or "SHORT INTEGER" or "UNSIGNED INTEGER" causes the primary key column to behave as an ordinary table column with integer <a href="datatype3.html#affinity">affinity</a> and a unique index, not as an alias for the rowid. </p><p> The exception mentioned above is that if the declaration of a column with declared type "INTEGER" includes an "PRIMARY KEY DESC" clause, it does not become an alias for the rowid and is not classified as an integer primary key. This quirk is not by design. It is due to a bug in early versions of SQLite. But fixing the bug could result in backwards incompatibilities. Hence, the original behavior has been retained (and documented) because odd behavior in a corner case is far better than a compatibility break. This means that the following three table declarations all cause the column "x" to be an alias for the rowid (an integer primary key): </p><ul> <li><tt>CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z);</tt> </li><li><tt>CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x ASC));</tt> </li><li><tt>CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC));</tt> </li></ul> <p>But the following declaration does not result in "x" being an alias for the rowid: </p><ul> <li><tt>CREATE TABLE t(x INTEGER PRIMARY KEY DESC, y, z);</tt> </li></ul> <p>Rowid values may be modified using an UPDATE statement in the same way as any other column value can, either using one of the built-in aliases ("rowid", "oid" or "_rowid_") or by using an alias created by an integer primary key. Similarly, an INSERT statement may provide a value to use as the rowid for each row inserted. Unlike normal SQLite columns, an integer primary key or rowid column must contain integer values. Integer primary key or rowid columns are not able to hold floating point values, strings, BLOBs, or NULLs. </p><p>If an UPDATE statement attempts to set an integer primary key or rowid column to a NULL or blob value, or to a string or real value that cannot be losslessly converted to an integer, a "datatype mismatch" error occurs and the statement is aborted. If an INSERT statement attempts to insert a blob value, or a string or real value that cannot be losslessly converted to an integer into an integer primary key or rowid column, a "datatype mismatch" error occurs and the statement is aborted. </p><p>If an INSERT statement attempts to insert a NULL value into a rowid or integer primary key column, the system chooses an integer value to use as the rowid automatically. A detailed description of how this is done is provided <a href="autoinc.html">separately</a>.</p> <p>The <a href="foreignkeys.html#parentchild">parent key</a> of a <a href="foreignkeys.html">foreign key constraint</a> is not allowed to use the rowid. The parent key must used named columns only.</p> |
Changes to Doc/Extra/Core/lang_createtrigger.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>CREATE TRIGGER</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < > | | | | < | | < < < < > > > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> CREATE TRIGGER </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#syntax">1. Syntax</a></div> <div class="fancy-toc1"><a href="#description">2. Description</a></div> <div class="fancy-toc2"><a href="#syntax_restrictions_on_update_delete_and_insert_statements_within_triggers">2.1. Syntax Restrictions On UPDATE, DELETE, and INSERT Statements Within Triggers</a></div> <div class="fancy-toc1"><a href="#instead_of_triggers">3. INSTEAD OF triggers</a></div> <div class="fancy-toc1"><a href="#some_example_triggers">4. Some Example Triggers</a></div> <div class="fancy-toc1"><a href="#cautions_on_the_use_of_before_triggers">5. Cautions On The Use Of BEFORE triggers</a></div> <div class="fancy-toc1"><a href="#the_raise_function">6. The RAISE() function</a></div> <div class="fancy-toc1"><a href="#temp_triggers_on_non_temp_tables">7. TEMP Triggers on Non-TEMP Tables</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/create-trigger-stmt.html">create-trigger-stmt:</a></b> <button id='x1471' onclick='hideorshow("x1471","x1472")'>hide</button></p> <div id='x1472' class='imgcontainer'> <img alt="syntax diagram create-trigger-stmt" src="images/syntax/create-trigger-stmt.gif" /> <p><b><a href="syntax/delete-stmt.html">delete-stmt:</a></b> <button id='x1473' onclick='hideorshow("x1473","x1474")'>show</button></p> <div id='x1474' style='display:none;' class='imgcontainer'> <img alt="syntax diagram delete-stmt" src="images/syntax/delete-stmt.gif" /> <p><b><a href="syntax/qualified-table-name.html">qualified-table-name:</a></b> <button id='x1475' onclick='hideorshow("x1475","x1476")'>show</button></p> <div id='x1476' style='display:none;' class='imgcontainer'> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif" /> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x1477' onclick='hideorshow("x1477","x1478")'>show</button></p> <div id='x1478' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x1479' onclick='hideorshow("x1479","x1480")'>show</button></p> <div id='x1480' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> </div> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1481' onclick='hideorshow("x1481","x1482")'>show</button></p> <div id='x1482' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1483' onclick='hideorshow("x1483","x1484")'>show</button></p> <div id='x1484' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1485' onclick='hideorshow("x1485","x1486")'>show</button></p> <div id='x1486' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1487' onclick='hideorshow("x1487","x1488")'>show</button></p> <div id='x1488' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1489' onclick='hideorshow("x1489","x1490")'>show</button></p> <div id='x1490' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1491' onclick='hideorshow("x1491","x1492")'>show</button></p> <div id='x1492' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1493' onclick='hideorshow("x1493","x1494")'>show</button></p> <div id='x1494' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1495' onclick='hideorshow("x1495","x1496")'>show</button></p> <div id='x1496' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1497' onclick='hideorshow("x1497","x1498")'>show</button></p> <div id='x1498' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/insert-stmt.html">insert-stmt:</a></b> <button id='x1499' onclick='hideorshow("x1499","x1500")'>show</button></p> <div id='x1500' style='display:none;' class='imgcontainer'> <img alt="syntax diagram insert-stmt" src="images/syntax/insert-stmt.gif" /> <p><b><a href="syntax/upsert-clause.html">upsert-clause:</a></b> <button id='x1501' onclick='hideorshow("x1501","x1502")'>show</button></p> <div id='x1502' style='display:none;' class='imgcontainer'> <img alt="syntax diagram upsert-clause" src="images/syntax/upsert-clause.gif" /> <p><b><a href="syntax/column-name-list.html">column-name-list:</a></b> <button id='x1503' onclick='hideorshow("x1503","x1504")'>show</button></p> <div id='x1504' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-name-list" src="images/syntax/column-name-list.gif" /> </div> <p><b><a href="syntax/indexed-column.html">indexed-column:</a></b> <button id='x1505' onclick='hideorshow("x1505","x1506")'>show</button></p> <div id='x1506' style='display:none;' class='imgcontainer'> <img alt="syntax diagram indexed-column" src="images/syntax/indexed-column.gif" /> </div> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x1507' onclick='hideorshow("x1507","x1508")'>show</button></p> <div id='x1508' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x1509' onclick='hideorshow("x1509","x1510")'>show</button></p> <div id='x1510' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> </div> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1511' onclick='hideorshow("x1511","x1512")'>show</button></p> <div id='x1512' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1513' onclick='hideorshow("x1513","x1514")'>show</button></p> <div id='x1514' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1515' onclick='hideorshow("x1515","x1516")'>show</button></p> <div id='x1516' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1517' onclick='hideorshow("x1517","x1518")'>show</button></p> <div id='x1518' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1519' onclick='hideorshow("x1519","x1520")'>show</button></p> <div id='x1520' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1521' onclick='hideorshow("x1521","x1522")'>show</button></p> <div id='x1522' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1523' onclick='hideorshow("x1523","x1524")'>show</button></p> <div id='x1524' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1525' onclick='hideorshow("x1525","x1526")'>show</button></p> <div id='x1526' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1527' onclick='hideorshow("x1527","x1528")'>show</button></p> <div id='x1528' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1529' onclick='hideorshow("x1529","x1530")'>show</button></p> <div id='x1530' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1531' onclick='hideorshow("x1531","x1532")'>show</button></p> <div id='x1532' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/update-stmt.html">update-stmt:</a></b> <button id='x1533' onclick='hideorshow("x1533","x1534")'>show</button></p> <div id='x1534' style='display:none;' class='imgcontainer'> <img alt="syntax diagram update-stmt" src="images/syntax/update-stmt.gif" /> <p><b><a href="syntax/column-name-list.html">column-name-list:</a></b> <button id='x1535' onclick='hideorshow("x1535","x1536")'>show</button></p> <div id='x1536' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-name-list" src="images/syntax/column-name-list.gif" /> </div> <p><b><a href="syntax/qualified-table-name.html">qualified-table-name:</a></b> <button id='x1537' onclick='hideorshow("x1537","x1538")'>show</button></p> <div id='x1538' style='display:none;' class='imgcontainer'> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif" /> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x1539' onclick='hideorshow("x1539","x1540")'>show</button></p> <div id='x1540' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x1541' onclick='hideorshow("x1541","x1542")'>show</button></p> <div id='x1542' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> </div> </div> </div> <h1 id="description"><span>2. </span>Description</h1> <p>The CREATE TRIGGER statement is used to add triggers to the database schema. Triggers are database operations that are automatically performed when a specified database event occurs. </p> <p>Each trigger must specify that it will fire for one of the following operations: <a href="lang_delete.html">DELETE</a>, <a href="lang_insert.html">INSERT</a>, <a href="lang_update.html">UPDATE</a>. |
304 305 306 307 308 309 310 | <p>Both the WHEN clause and the trigger actions may access elements of the row being inserted, deleted or updated using references of the form "NEW.<i>column-name</i>" and "OLD.<i>column-name</i>", where <i>column-name</i> is the name of a column from the table that the trigger is associated with. OLD and NEW references may only be used in triggers on events for which they are relevant, as follows:</p> | | | | | | | | | | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | <p>Both the WHEN clause and the trigger actions may access elements of the row being inserted, deleted or updated using references of the form "NEW.<i>column-name</i>" and "OLD.<i>column-name</i>", where <i>column-name</i> is the name of a column from the table that the trigger is associated with. OLD and NEW references may only be used in triggers on events for which they are relevant, as follows:</p> <table border="0" cellpadding="10"> <tr> <td valign="top" align="right" width="120"><i>INSERT</i></td> <td valign="top">NEW references are valid</td> </tr> <tr> <td valign="top" align="right" width="120"><i>UPDATE</i></td> <td valign="top">NEW and OLD references are valid</td> </tr> <tr> <td valign="top" align="right" width="120"><i>DELETE</i></td> <td valign="top">OLD references are valid</td> </tr> </table> <p>If a WHEN clause is supplied, the SQL statements specified are only executed if the WHEN clause is true. If no WHEN clause is supplied, the SQL statements are executed every time the trigger fires.</p> <p>The BEFORE or AFTER keyword determines when the trigger actions will be executed relative to the insertion, modification or removal of the associated row. BEFORE is the default when neither keyword is present.</p> <p>An <a href="lang_conflict.html">ON CONFLICT</a> clause may be specified as part of an <a href="lang_update.html">UPDATE</a> or <a href="lang_insert.html">INSERT</a> action within the body of the trigger. However if an <a href="lang_conflict.html">ON CONFLICT</a> clause is specified as part of the statement causing the trigger to fire, then conflict handling policy of the outer statement is used instead.</p> <p>Triggers are automatically <a href="lang_droptrigger.html">dropped</a> when the table that they are associated with (the <i>table-name</i> table) is <a href="lang_droptable.html">dropped</a>. However if the trigger actions reference other tables, the trigger is not dropped or modified if those other tables are <a href="lang_droptable.html">dropped</a> or <a href="lang_altertable.html">modified</a>.</p> <p>Triggers are removed using the <a href="lang_droptrigger.html">DROP TRIGGER</a> statement.</p> <h2 id="syntax_restrictions_on_update_delete_and_insert_statements_within_triggers"><span>2.1. </span>Syntax Restrictions On UPDATE, DELETE, and INSERT Statements Within Triggers</h2> <p>The <a href="lang_update.html">UPDATE</a>, <a href="lang_delete.html">DELETE</a>, and <a href="lang_insert.html">INSERT</a> statements within triggers do not support the full syntax for <a href="lang_update.html">UPDATE</a>, <a href="lang_delete.html">DELETE</a>, and <a href="lang_insert.html">INSERT</a> statements. The following restrictions apply:</p> <ul> |
394 395 396 397 398 399 400 | <a href="syntax/common-table-expression.html">Common table expression</a> are not supported for statements inside of triggers. </p></li> </ul> <a name="instead_of_trigger"></a> | | | | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 | <a href="syntax/common-table-expression.html">Common table expression</a> are not supported for statements inside of triggers. </p></li> </ul> <a name="instead_of_trigger"></a> <h1 id="instead_of_triggers"><span>3. </span>INSTEAD OF triggers</h1> <p>Triggers may be created on <a href="lang_createview.html">views</a>, as well as ordinary tables, by specifying INSTEAD OF in the CREATE TRIGGER statement. If one or more ON INSERT, ON DELETE or ON UPDATE triggers are defined on a view, then it is not an error to execute an INSERT, DELETE or UPDATE statement on the view, respectively. Instead, executing an INSERT, DELETE or UPDATE on the view causes the associated triggers to fire. The real tables underlying the view are not modified (except possibly explicitly, by a trigger program).</p> <p>Note that the <a href="c3ref/changes.html">sqlite3_changes()</a> and <a href="c3ref/total_changes.html">sqlite3_total_changes()</a> interfaces do not count INSTEAD OF trigger firings, but the <a href="pragma.html#pragma_count_changes">count_changes pragma</a> does count INSTEAD OF trigger firing.</p> <h1 id="some_example_triggers"><span>4. </span>Some Example Triggers</h1> <p>Assuming that customer records are stored in the "customers" table, and that order records are stored in the "orders" table, the following UPDATE trigger ensures that all associated orders are redirected when a customer changes his or her address:</p> |
455 456 457 458 459 460 461 | INSTEAD OF UPDATE OF cust_addr ON customer_address BEGIN UPDATE customer SET cust_addr=NEW.cust_addr WHERE cust_id=NEW.cust_id; END; </pre></blockquote> | | | | | | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 | INSTEAD OF UPDATE OF cust_addr ON customer_address BEGIN UPDATE customer SET cust_addr=NEW.cust_addr WHERE cust_id=NEW.cust_id; END; </pre></blockquote> </p><p>With the schema above, a statement of the form:</p> <blockquote><pre> UPDATE customer_address SET cust_addr=$new_address WHERE cust_id=$cust_id; </pre></blockquote> <p>Causes the customer.cust_addr field to be updated for a specific customer entry that has customer.cust_id equal to the $cust_id parameter. Note how the values assigned to the view are made available as field in the special "NEW" table within the trigger body.</p> <a name="undef_before"></a> <h1 id="cautions_on_the_use_of_before_triggers"><span>5. </span>Cautions On The Use Of BEFORE triggers</h1> <p>If a BEFORE UPDATE or BEFORE DELETE trigger modifies or deletes a row that was to have been updated or deleted, then the result of the subsequent update or delete operation is undefined. Furthermore, if a BEFORE trigger modifies or deletes a row, then it is undefined whether or not AFTER triggers that would have otherwise run on those rows will in fact run. </p> <p>The value of NEW.rowid is undefined in a BEFORE INSERT trigger in which the rowid is not explicitly set to an integer.</p> <p>Because of the behaviors described above, programmers are encouraged to prefer AFTER triggers over BEFORE triggers.</p> <a name="raise"></a> <h1 id="the_raise_function"><span>6. </span>The RAISE() function</h1> <p>A special SQL function RAISE() may be used within a trigger-program, with the following syntax</p> <p><b><a href="syntax/raise-function.html">raise-function:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif"></img> </div> <p>When one of RAISE(ROLLBACK,...), RAISE(ABORT,...) or RAISE(FAIL,...) is called during trigger-program execution, the specified <a href="lang_conflict.html">ON CONFLICT</a> processing is performed and the current query terminates. An error code of <a href="rescode.html#constraint">SQLITE_CONSTRAINT</a> is returned to the application, along with the specified error message.</p> <p>When RAISE(IGNORE) is called, the remainder of the current trigger program, the statement that caused the trigger program to execute and any subsequent trigger programs that would have been executed are abandoned. No database changes are rolled back. If the statement that caused the trigger program to execute is itself part of a trigger program, then that trigger program resumes execution at the beginning of the next step. </p> <a name="temptrig"></a> <h1 id="temp_triggers_on_non_temp_tables"><span>7. </span>TEMP Triggers on Non-TEMP Tables</h1> <p>A trigger normally exists in the same database as the table named after the "ON" keyword in the CREATE TRIGGER statement. Except, it is possible to create a TEMP TRIGGER on a table in another database. Such a trigger will only fire when changes are made to the target table by the application that defined the trigger. Other applications that modify the database will not be able to see the |
534 535 536 537 538 539 540 541 | <blockquote><pre> CREATE TEMP TRIGGER ex1 AFTER INSERT ON <b>main.</b>tab1 BEGIN ... </pre></blockquote> <p>Failure to specify the schema name on the target table could result in the TEMP trigger being reattached to a table with the same name in another database whenever any schema change occurs.</p> | < | 576 577 578 579 580 581 582 583 | <blockquote><pre> CREATE TEMP TRIGGER ex1 AFTER INSERT ON <b>main.</b>tab1 BEGIN ... </pre></blockquote> <p>Failure to specify the schema name on the target table could result in the TEMP trigger being reattached to a table with the same name in another database whenever any schema change occurs.</p> |
Changes to Doc/Extra/Core/lang_createview.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>CREATE VIEW</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> CREATE VIEW </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/create-view-stmt.html">create-view-stmt:</a></b> <button id='x1543' onclick='hideorshow("x1543","x1544")'>hide</button></p> <div id='x1544' class='imgcontainer'> <img alt="syntax diagram create-view-stmt" src="images/syntax/create-view-stmt.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1545' onclick='hideorshow("x1545","x1546")'>show</button></p> <div id='x1546' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1547' onclick='hideorshow("x1547","x1548")'>show</button></p> <div id='x1548' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1549' onclick='hideorshow("x1549","x1550")'>show</button></p> <div id='x1550' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1551' onclick='hideorshow("x1551","x1552")'>show</button></p> <div id='x1552' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1553' onclick='hideorshow("x1553","x1554")'>show</button></p> <div id='x1554' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1555' onclick='hideorshow("x1555","x1556")'>show</button></p> <div id='x1556' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1557' onclick='hideorshow("x1557","x1558")'>show</button></p> <div id='x1558' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1559' onclick='hideorshow("x1559","x1560")'>show</button></p> <div id='x1560' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1561' onclick='hideorshow("x1561","x1562")'>show</button></p> <div id='x1562' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1563' onclick='hideorshow("x1563","x1564")'>show</button></p> <div id='x1564' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1565' onclick='hideorshow("x1565","x1566")'>show</button></p> <div id='x1566' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1567' onclick='hideorshow("x1567","x1568")'>show</button></p> <div id='x1568' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1569' onclick='hideorshow("x1569","x1570")'>show</button></p> <div id='x1570' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1571' onclick='hideorshow("x1571","x1572")'>show</button></p> <div id='x1572' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1573' onclick='hideorshow("x1573","x1574")'>show</button></p> <div id='x1574' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1575' onclick='hideorshow("x1575","x1576")'>show</button></p> <div id='x1576' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1577' onclick='hideorshow("x1577","x1578")'>show</button></p> <div id='x1578' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1579' onclick='hideorshow("x1579","x1580")'>show</button></p> <div id='x1580' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1581' onclick='hideorshow("x1581","x1582")'>show</button></p> <div id='x1582' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <h1 id="description"><span>2. </span>Description</h1> <p>The CREATE VIEW command assigns a name to a pre-packaged <a href="lang_select.html">SELECT</a> statement. Once the view is created, it can be used in the FROM clause of another <a href="lang_select.html">SELECT</a> in place of a table name. </p> |
229 230 231 232 233 234 235 | well-defined names using the "<a href="syntax/result-column.html">AS column-alias</a>" syntax. SQLite allows you to create views that depend on automatically generated column names, but you should avoid using them since the rules used to generate column names are not a defined part of the interface and might change in future releases of SQLite. | | | | 243 244 245 246 247 248 249 250 251 252 253 | well-defined names using the "<a href="syntax/result-column.html">AS column-alias</a>" syntax. SQLite allows you to create views that depend on automatically generated column names, but you should avoid using them since the rules used to generate column names are not a defined part of the interface and might change in future releases of SQLite. </p><p>The <span class='yyterm'>column-name</span> list syntax was added in SQLite versions 3.9.0 (2015-10-14). </p> |
Changes to Doc/Extra/Core/lang_createvtab.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>CREATE VIRTUAL TABLE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> CREATE VIRTUAL TABLE </div> </div> <p><b><a href="syntax/create-virtual-table-stmt.html">create-virtual-table-stmt:</a></b> <button id='x1583' onclick='hideorshow("x1583","x1584")'>hide</button></p> <div id='x1584' class='imgcontainer'> <img alt="syntax diagram create-virtual-table-stmt" src="images/syntax/create-virtual-table-stmt.gif" /> </div> <p>A <a href="vtab.html">virtual table</a> is an interface to an external storage or computation engine that appears to be a table but does not actually store information in the database file.</p> |
121 122 123 124 125 126 127 128 | to the <a href="vtab.html#xcreate">xCreate</a> and <a href="vtab.html#xconnect">xConnect</a> methods of the module implementation without any interpretation. It is the responsibility of the module implementation to parse and interpret its own arguments.</p> <p>A virtual table is destroyed using the ordinary <a href="lang_droptable.html">DROP TABLE</a> statement. There is no DROP VIRTUAL TABLE statement.</p> | < | 132 133 134 135 136 137 138 139 | to the <a href="vtab.html#xcreate">xCreate</a> and <a href="vtab.html#xconnect">xConnect</a> methods of the module implementation without any interpretation. It is the responsibility of the module implementation to parse and interpret its own arguments.</p> <p>A virtual table is destroyed using the ordinary <a href="lang_droptable.html">DROP TABLE</a> statement. There is no DROP VIRTUAL TABLE statement.</p> |
Changes to Doc/Extra/Core/lang_datefunc.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Date And Time Functions</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> Date And Time Functions </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#overview">1. Overview</a></div> <div class="fancy-toc1"><a href="#time_strings">2. Time Strings</a></div> <div class="fancy-toc1"><a href="#modifiers">3. Modifiers</a></div> <div class="fancy-toc1"><a href="#examples">4. Examples</a></div> <div class="fancy-toc1"><a href="#caveats_and_bugs">5. Caveats And Bugs</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p> SQLite supports five date and time functions as follows: </p> <p> </p><ol> <li> <b>date(</b><i>timestring, modifier, modifier, ...</i><b>)</b> </li> <li> <b>time(</b><i>timestring, modifier, modifier, ...</i><b>)</b> </li> <li> <b>datetime(</b><i>timestring, modifier, modifier, ...</i><b>)</b> </li> <li> <b>julianday(</b><i>timestring, modifier, modifier, ...</i><b>)</b> </li> <li> <b>strftime(</b><i>format, timestring, modifier, modifier, ...</i><b>)</b> </li> </ol> |
129 130 131 132 133 134 135 | <a href="http://opengroup.org/onlinepubs/007908799/xsh/strftime.html">strftime() function</a> from the standard C library plus two new substitutions, %f and %J. The following is a complete list of valid strftime() substitutions: </p> <blockquote> <table border="0" cellpadding="0" cellspacing="0"> | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 | <a href="http://opengroup.org/onlinepubs/007908799/xsh/strftime.html">strftime() function</a> from the standard C library plus two new substitutions, %f and %J. The following is a complete list of valid strftime() substitutions: </p> <blockquote> <table border="0" cellpadding="0" cellspacing="0"> <tr><td></td><td width="10"></td><td></td></tr> <tr><td> %d </td><td></td><td> day of month: 00 </td></tr><tr><td> %f </td><td></td><td> fractional seconds: SS.SSS </td></tr><tr><td> %H </td><td></td><td> hour: 00-24 </td></tr><tr><td> %j </td><td></td><td> day of year: 001-366 </td></tr><tr><td> %J </td><td></td><td> Julian day number </td></tr><tr><td> %m </td><td></td><td> month: 01-12 </td></tr><tr><td> %M </td><td></td><td> minute: 00-59 </td></tr><tr><td> %s </td><td></td><td> seconds since 1970-01-01 </td></tr><tr><td> %S </td><td></td><td> seconds: 00-59 </td></tr><tr><td> %w </td><td></td><td> day of week 0-6 with Sunday==0 </td></tr><tr><td> %W </td><td></td><td> week of year: 00-53 </td></tr><tr><td> %Y </td><td></td><td> year: 0000-9999 </td></tr><tr><td> %% </td><td></td><td> % </td></tr></table> </blockquote> <p> Notice that all other date and time functions can be expressed in terms of strftime(): </p> <blockquote> <table border="0" cellpadding="0" cellspacing="0"> <tr><td><b>Function</b></td><td width="30"></td><td><b>Equivalent strftime()</b> </td></tr><tr><td> date(...) </td><td></td><td> strftime('%Y-%m-%d', ...) </td></tr><tr><td> time(...) </td><td></td><td> strftime('%H:%M:%S', ...) </td></tr><tr><td> datetime(...) </td><td></td><td> strftime('%Y-%m-%d %H:%M:%S', ...) </td></tr><tr><td> julianday(...) </td><td></td><td> strftime('%J', ...) </td></tr></table> </blockquote> <p> The only reasons for providing functions other than strftime() is for convenience and for efficiency. </p> <h1 id="time_strings"><span>2. </span>Time Strings</h1> <p>A time string can be in any of the following formats:</p> <ol> <li> <i>YYYY-MM-DD</i> </li><li> <i>YYYY-MM-DD HH:MM</i> </li><li> <i>YYYY-MM-DD HH:MM:SS</i> </li><li> <i>YYYY-MM-DD HH:MM:SS.SSS</i> </li><li> <i>YYYY-MM-DD</i><b>T</b><i>HH:MM</i> </li><li> <i>YYYY-MM-DD</i><b>T</b><i>HH:MM:SS</i> </li><li> <i>YYYY-MM-DD</i><b>T</b><i>HH:MM:SS.SSS</i> </li><li> <i>HH:MM</i> </li><li> <i>HH:MM:SS</i> </li><li> <i>HH:MM:SS.SSS</i> </li><li> <b>now</b> </li><li> <i>DDDDDDDDDD</i> </li></ol> <p> In formats 5 through 7, the "T" is a literal character separating the date and the time, as required by <a href="http://www.w3c.org/TR/NOTE-datetime">ISO-8601</a>. Formats 8 through 10 that specify only a time assume a date of 2000-01-01. Format 11, the string 'now', is converted into the |
228 229 230 231 232 233 234 | to the result, but the input string can have fewer or more than three digits and the date/time functions will still operate correctly. Similarly, format 12 is shown with 10 significant digits, but the date/time functions will really accept as many or as few digits as are necessary to represent the Julian day number. </p> | | | | | | | | | | | | | | | | 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | to the result, but the input string can have fewer or more than three digits and the date/time functions will still operate correctly. Similarly, format 12 is shown with 10 significant digits, but the date/time functions will really accept as many or as few digits as are necessary to represent the Julian day number. </p> <h1 id="modifiers"><span>3. </span>Modifiers</h1> <p>The time string can be followed by zero or more modifiers that alter date and/or time. Each modifier is a transformation that is applied to the time value to its left. Modifiers are applied from left to right; order is important. The available modifiers are as follows.</p> <ol> <li> NNN days </li><li> NNN hours </li><li> NNN minutes </li><li> NNN.NNNN seconds </li><li> NNN months </li><li> NNN years </li><li> start of month </li><li> start of year </li><li> start of day </li><li> weekday N </li><li> unixepoch </li><li> localtime </li><li> utc </li></ol> <p>The first six modifiers (1 through 6) simply add the specified amount of time to the date and time specified by the preceding timestring and modifiers. The 's' character at the end of the modifier names is optional. Note that "±NNN months" works by rendering the original date into the YYYY-MM-DD format, adding the ±NNN to the MM month value, then |
300 301 302 303 304 305 306 | follows a time that is not UTC, then the behavior is undefined. The "utc" modifier is the opposite of "localtime". "utc" assumes that the string to its left is in the local timezone and adjusts that string to be in UTC. If the prior string is not in localtime, then the result of "utc" is undefined.</p> | | | | | 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 | follows a time that is not UTC, then the behavior is undefined. The "utc" modifier is the opposite of "localtime". "utc" assumes that the string to its left is in the local timezone and adjusts that string to be in UTC. If the prior string is not in localtime, then the result of "utc" is undefined.</p> <h1 id="examples"><span>4. </span>Examples</h1> <p>Compute the current date.</p><p> </p><blockquote>SELECT date('now');</blockquote> <p>Compute the last day of the current month.</p> <blockquote>SELECT date('now','start of month','+1 month','-1 day'); </blockquote> <p>Compute the date and time given a unix timestamp 1092941466.</p> |
359 360 361 362 363 364 365 | <p>Compute the time since the unix epoch in seconds (like strftime('%s','now') except includes fractional part):</p> <blockquote> SELECT (julianday('now') - 2440587.5)*86400.0; </blockquote> | | | 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | <p>Compute the time since the unix epoch in seconds (like strftime('%s','now') except includes fractional part):</p> <blockquote> SELECT (julianday('now') - 2440587.5)*86400.0; </blockquote> <h1 id="caveats_and_bugs"><span>5. </span>Caveats And Bugs</h1> <p>The computation of local time depends heavily on the whim of politicians and is thus difficult to get correct for all locales. In this implementation, the standard C library function localtime_r() is used to assist in the calculation of local time. The localtime_r() C function normally only works for years |
389 390 391 392 393 394 395 396 | to all previous years as well. Vista does somewhat better getting results correct back to 1986, when the rules were also changed.</p> <p>All internal computations assume the <a href="http://en.wikipedia.org/wiki/Gregorian_calendar">Gregorian calendar</a> system. It is also assumed that every day is exactly 86400 seconds in duration.</p> | < | 424 425 426 427 428 429 430 431 | to all previous years as well. Vista does somewhat better getting results correct back to 1986, when the rules were also changed.</p> <p>All internal computations assume the <a href="http://en.wikipedia.org/wiki/Gregorian_calendar">Gregorian calendar</a> system. It is also assumed that every day is exactly 86400 seconds in duration.</p> |
Changes to Doc/Extra/Core/lang_delete.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DELETE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> DELETE </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#overview">1. Overview</a></div> <div class="fancy-toc1"><a href="#restrictions_on_delete_statements_within_create_trigger">2. Restrictions on DELETE Statements Within CREATE TRIGGER</a></div> <div class="fancy-toc1"><a href="#optional_limit_and_order_by_clauses">3. Optional LIMIT and ORDER BY clauses</a></div> <div class="fancy-toc1"><a href="#the_truncate_optimization">4. The Truncate Optimization</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/delete-stmt.html">delete-stmt:</a></b> <button id='x1585' onclick='hideorshow("x1585","x1586")'>hide</button></p> <div id='x1586' class='imgcontainer'> <img alt="syntax diagram delete-stmt" src="images/syntax/delete-stmt.gif" /> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1587' onclick='hideorshow("x1587","x1588")'>show</button></p> <div id='x1588' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1589' onclick='hideorshow("x1589","x1590")'>show</button></p> <div id='x1590' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1591' onclick='hideorshow("x1591","x1592")'>show</button></p> <div id='x1592' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1593' onclick='hideorshow("x1593","x1594")'>show</button></p> <div id='x1594' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1595' onclick='hideorshow("x1595","x1596")'>show</button></p> <div id='x1596' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1597' onclick='hideorshow("x1597","x1598")'>show</button></p> <div id='x1598' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1599' onclick='hideorshow("x1599","x1600")'>show</button></p> <div id='x1600' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1601' onclick='hideorshow("x1601","x1602")'>show</button></p> <div id='x1602' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1603' onclick='hideorshow("x1603","x1604")'>show</button></p> |
260 261 262 263 264 265 266 267 268 269 270 271 272 273 | <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1621' onclick='hideorshow("x1621","x1622")'>show</button></p> <div id='x1622' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </div> <p>The DELETE command removes records from the table identified by the <a href="syntax/qualified-table-name.html">qualified-table-name</a>. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1621' onclick='hideorshow("x1621","x1622")'>show</button></p> <div id='x1622' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1623' onclick='hideorshow("x1623","x1624")'>show</button></p> <div id='x1624' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1625' onclick='hideorshow("x1625","x1626")'>show</button></p> <div id='x1626' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/qualified-table-name.html">qualified-table-name:</a></b> <button id='x1627' onclick='hideorshow("x1627","x1628")'>show</button></p> <div id='x1628' style='display:none;' class='imgcontainer'> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif" /> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x1629' onclick='hideorshow("x1629","x1630")'>show</button></p> <div id='x1630' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x1631' onclick='hideorshow("x1631","x1632")'>show</button></p> <div id='x1632' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1633' onclick='hideorshow("x1633","x1634")'>show</button></p> <div id='x1634' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1635' onclick='hideorshow("x1635","x1636")'>show</button></p> <div id='x1636' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1637' onclick='hideorshow("x1637","x1638")'>show</button></p> <div id='x1638' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1639' onclick='hideorshow("x1639","x1640")'>show</button></p> <div id='x1640' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1641' onclick='hideorshow("x1641","x1642")'>show</button></p> <div id='x1642' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1643' onclick='hideorshow("x1643","x1644")'>show</button></p> <div id='x1644' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1645' onclick='hideorshow("x1645","x1646")'>show</button></p> <div id='x1646' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1647' onclick='hideorshow("x1647","x1648")'>show</button></p> <div id='x1648' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1649' onclick='hideorshow("x1649","x1650")'>show</button></p> <div id='x1650' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1651' onclick='hideorshow("x1651","x1652")'>show</button></p> <div id='x1652' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1653' onclick='hideorshow("x1653","x1654")'>show</button></p> <div id='x1654' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </div> <p>The DELETE command removes records from the table identified by the <a href="syntax/qualified-table-name.html">qualified-table-name</a>. </p><p>If the WHERE clause is not present, all records in the table are deleted. If a WHERE clause is supplied, then only those rows for which the WHERE clause <a href="lang_expr.html#booleanexpr">boolean expression</a> is true are deleted. Rows for which the expression is false or NULL are retained. </p><h1 id="restrictions_on_delete_statements_within_create_trigger"><span>2. </span>Restrictions on DELETE Statements Within CREATE TRIGGER</h1> <p>The following restrictions apply to DELETE statements that occur within the body of a <a href="lang_createtrigger.html">CREATE TRIGGER</a> statement: </p><ul> <li><p>The <span class='yyterm'>table-name</span> specified as part of a DELETE statement within a trigger body must be unqualified. In other words, the <i>schema-name</i><b>.</b> prefix on the table name is not allowed within triggers. If the table to which the trigger is attached is not in the temp database, then DELETE statements within the trigger body must operate on tables within the same database as it. If the table to which the trigger is attached is in the TEMP database, then the unqualified name of the table being deleted is resolved in the same way as it is for a top-level statement (by searching first the TEMP database, then the main database, then any other databases in the order they were attached). </p></li><li><p>The INDEXED BY and NOT INDEXED clauses are not allowed on DELETE statements within triggers.</p> </li><li><p>The LIMIT and ORDER BY clauses (described below) are unsupported for DELETE statements within triggers.</p> </li></ul> <h1 id="optional_limit_and_order_by_clauses"><span>3. </span>Optional LIMIT and ORDER BY clauses</h1> <p>If SQLite is compiled with the <a href="compile.html#enable_update_delete_limit">SQLITE_ENABLE_UPDATE_DELETE_LIMIT</a> compile-time option, then the syntax of the DELETE statement is extended by the addition of optional ORDER BY and LIMIT clauses:</p> <p><b><a href="syntax/delete-stmt-limited.html">delete-stmt-limited:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram delete-stmt-limited" src="images/syntax/delete-stmt-limited.gif"></img> </div> <p>If a DELETE statement has a LIMIT clause, the maximum number of rows that will be deleted is found by evaluating the accompanying expression and casting it to an integer value. If the result of the evaluating the LIMIT clause cannot be losslessly converted to an integer value, it is an error. A negative LIMIT value is interpreted as "no limit". If the DELETE statement also has an OFFSET clause, then it is similarly evaluated and cast to an integer value. Again, it is an error if the value cannot be losslessly converted to an integer. If there is no OFFSET clause, or the calculated integer value is negative, the effective OFFSET value is zero. </p><p>If the DELETE statement has an ORDER BY clause, then all rows that would be deleted in the absence of the LIMIT clause are sorted according to the ORDER BY. The first <i>M</i> rows, where <i>M</i> is the value found by evaluating the OFFSET clause expression, are skipped, and the following <i>N</i>, where <i>N</i> is the value of the LIMIT expression, are deleted. If there are less than <i>N</i> rows remaining after taking the OFFSET clause into account, or if the LIMIT clause evaluated to a negative value, then all remaining rows are deleted. </p><p>If the DELETE statement has no ORDER BY clause, then all rows that would be deleted in the absence of the LIMIT clause are assembled in an arbitrary order before applying the LIMIT and OFFSET clauses to determine the subset that are actually deleted. </p><p>The ORDER BY clause on a DELETE statement is used only to determine which rows fall within the LIMIT. The order in which rows are deleted is arbitrary and is not influenced by the ORDER BY clause. <a name="truncateopt"></a> </p><h1 id="the_truncate_optimization"><span>4. </span>The Truncate Optimization</h1> <p>When the WHERE is omitted from a DELETE statement and the table being deleted has no triggers, SQLite uses an optimization to erase the entire table content without having to visit each row of the table individually. This "truncate" optimization makes the delete run much faster. Prior to SQLite <a href="releaselog/3_6_5.html">version 3.6.5</a> (2008-11-12), the truncate optimization also meant that the <a href="c3ref/changes.html">sqlite3_changes()</a> and <a href="c3ref/total_changes.html">sqlite3_total_changes()</a> interfaces and the <a href="pragma.html#pragma_count_changes">count_changes pragma</a> will not actually return the number of deleted rows. That problem has been fixed as of <a href="releaselog/3_6_5.html">version 3.6.5</a> (2008-11-12). </p><p>The truncate optimization can be permanently disabled for all queries by recompiling SQLite with the <a href="compile.html#omit_truncate_optimization">SQLITE_OMIT_TRUNCATE_OPTIMIZATION</a> compile-time switch.</p> <p>The truncate optimization can also be disabled at runtime using the <a href="c3ref/set_authorizer.html">sqlite3_set_authorizer()</a> interface. If an authorizer callback returns <a href="c3ref/c_deny.html">SQLITE_IGNORE</a> for an <a href="c3ref/c_alter_table.html">SQLITE_DELETE</a> action code, then the DELETE operation will proceed but the truncate optimization will be bypassed and rows will be deleted one by one.</p> |
Changes to Doc/Extra/Core/lang_detach.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DETACH</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | > > | < < | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> DETACH </div> </div> <p><b><a href="syntax/detach-stmt.html">detach-stmt:</a></b> <button id='x1655' onclick='hideorshow("x1655","x1656")'>hide</button></p> <div id='x1656' class='imgcontainer'> <img alt="syntax diagram detach-stmt" src="images/syntax/detach-stmt.gif" /> </div> <p>This statement detaches an additional database connection previously attached using the <a href="lang_attach.html">ATTACH</a> statement. When not in <a href="sharedcache.html">shared cache mode</a>, it is possible to have the same database file attached multiple times using different names, and detaching one connection to a file will leave the others intact.</p> <p> In <a href="sharedcache.html">shared cache mode</a>, attempting to attach the same database file more than once results in an error. </p> |
Changes to Doc/Extra/Core/lang_dropindex.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DROP INDEX</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> DROP INDEX </div> </div> <p><b><a href="syntax/drop-index-stmt.html">drop-index-stmt:</a></b> <button id='x1657' onclick='hideorshow("x1657","x1658")'>hide</button></p> <div id='x1658' class='imgcontainer'> <img alt="syntax diagram drop-index-stmt" src="images/syntax/drop-index-stmt.gif" /> </div> <p>The DROP INDEX statement removes an index added with the <a href="lang_createindex.html">CREATE INDEX</a> statement. The index is completely removed from the disk. The only way to recover the index is to reenter the appropriate <a href="lang_createindex.html">CREATE INDEX</a> command.</p> |
Changes to Doc/Extra/Core/lang_droptable.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DROP TABLE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> DROP TABLE </div> </div> <p><b><a href="syntax/drop-table-stmt.html">drop-table-stmt:</a></b> <button id='x1659' onclick='hideorshow("x1659","x1660")'>hide</button></p> <div id='x1660' class='imgcontainer'> <img alt="syntax diagram drop-table-stmt" src="images/syntax/drop-table-stmt.gif" /> </div> <p>The DROP TABLE statement removes a table added with the <a href="lang_createtable.html">CREATE TABLE</a> statement. The name specified is the table name. The dropped table is completely removed from the database |
118 119 120 121 122 123 124 | If the implicit DELETE FROM executed as part of a DROP TABLE command violates any immediate foreign key constraints, an error is returned and the table is not dropped. If the implicit DELETE FROM causes any deferred foreign key constraints to be violated, and the violations still exist when the transaction is committed, an error is returned at the time of commit. | | < | 128 129 130 131 132 133 134 135 | If the implicit DELETE FROM executed as part of a DROP TABLE command violates any immediate foreign key constraints, an error is returned and the table is not dropped. If the implicit DELETE FROM causes any deferred foreign key constraints to be violated, and the violations still exist when the transaction is committed, an error is returned at the time of commit. </p> |
Changes to Doc/Extra/Core/lang_droptrigger.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DROP TRIGGER</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > | | | < | 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 | }, 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; } </script> </div> <p><b><a href="syntax/drop-trigger-stmt.html">drop-trigger-stmt:</a></b> <button id='x1661' onclick='hideorshow("x1661","x1662")'>hide</button></p> <div id='x1662' class='imgcontainer'> <img alt="syntax diagram drop-trigger-stmt" src="images/syntax/drop-trigger-stmt.gif" /> </div> <p>The DROP TRIGGER statement removes a trigger created by the <a href="lang_createtrigger.html">CREATE TRIGGER</a> statement. Once removed, the trigger definition is no longer present in the sqlite_master (or sqlite_temp_master) table and is not fired by any subsequent INSERT, UPDATE or DELETE statements. <p>Note that triggers are automatically dropped when the associated table is dropped. |
Changes to Doc/Extra/Core/lang_dropview.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>DROP VIEW</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> DROP VIEW </div> </div> <p><b><a href="syntax/drop-view-stmt.html">drop-view-stmt:</a></b> <button id='x1663' onclick='hideorshow("x1663","x1664")'>hide</button></p> <div id='x1664' class='imgcontainer'> <img alt="syntax diagram drop-view-stmt" src="images/syntax/drop-view-stmt.gif" /> </div> <p>The DROP VIEW statement removes a view created by the <a href="lang_createview.html">CREATE VIEW</a> statement. The view definition is removed from the database schema, but no actual data in the underlying base tables is modified. </p><p>The view to drop is identified by the view-name and optional schema-name specified as part of the DROP VIEW statement. This reference is resolved using the standard procedure for <a href="lang_naming.html">object resolution</a>. </p><p> If the specified view cannot be found and the IF EXISTS clause is not present, it is an error. If the specified view cannot be found and an IF EXISTS clause is present in the DROP VIEW statement, then the statement is a no-op. </p> |
Changes to Doc/Extra/Core/lang_explain.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>EXPLAIN</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | > > | | | | | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> EXPLAIN </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/sql-stmt.html">sql-stmt:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram sql-stmt" src="images/syntax/sql-stmt.gif"></img> </div> <h1 id="description"><span>2. </span>Description</h1> <p>An SQL statement can be preceded by the keyword "EXPLAIN" or by the phrase "EXPLAIN QUERY PLAN". Either modification causes the SQL statement to behave as a query and to return information about how the SQL statement would have operated if the EXPLAIN keyword or phrase had been omitted.</p> <p>The output from EXPLAIN and EXPLAIN QUERY PLAN is intended for interactive analysis and troubleshooting only. The details of the output format are subject to change from one release of SQLite to the next. Applications should not use EXPLAIN or EXPLAIN QUERY PLAN since their exact behavior is variable and only partially documented.</p> <p>When the EXPLAIN keyword appears by itself it causes the statement to behave as a query that returns the sequence of <a href="opcode.html">virtual machine instructions</a> it would have used to execute the command had the EXPLAIN keyword not been present. When the EXPLAIN QUERY PLAN phrase appears, the statement returns high-level information regarding the query plan that would have been used. </p><p>The EXPLAIN QUERY PLAN command is described in <a href="eqp.html">more detail here</a>. </p><h2 id="explain_operates_at_run_time_not_at_prepare_time"><span>2.1. </span>EXPLAIN operates at run-time, not at prepare-time</h2> <p>The EXPLAIN and EXPLAIN QUERY PLAN prefixes affect the behavior of running a <a href="c3ref/stmt.html">prepared statement</a> using <a href="c3ref/step.html">sqlite3_step()</a>. The process of generating a new prepared statement using <a href="c3ref/prepare.html">sqlite3_prepare()</a> or similar is (mostly) unaffected by EXPLAIN. (The exception to the previous sentence is that some special opcodes used by EXPLAIN QUERY PLAN are omitted when building an EXPLAIN QUERY PLAN prepared statement, as a performance optimization.) </p><p>This means that actions that occur during sqlite3_prepare() are unaffected by EXPLAIN. </p><ul> <li><p> Some <a href="pragma.html#syntax">PRAGMA</a> statements do their work during sqlite3_prepare() rather than during sqlite3_step(). Those PRAGMA statements are unaffected by EXPLAIN. They operate the same with or without the EXPLAIN prefix. The set of PRAGMA statements that are unaffected by EXPLAIN can vary from one release to the next. Some PRAGMA statements operate during sqlite3_prepare() depending on their arguments. For consistent results, avoid using EXPLAIN on PRAGMA statements. </p></li><li><p> The <a href="c3ref/set_authorizer.html">authorizer callback</a> is invoked regardless of the presence of EXPLAIN or EXPLAIN QUERY PLAN. </p></li></ul> |
Changes to Doc/Extra/Core/lang_expr.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>SQL Langauge Expressions</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < | | 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 242 243 244 245 246 247 248 249 250 251 252 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> SQL Langauge Expressions </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#syntax">1. Syntax</a></div> <div class="fancy-toc1"><a href="#operators">2. Operators</a></div> <div class="fancy-toc1"><a href="#literal_values_constants_">3. Literal Values (Constants)</a></div> <div class="fancy-toc1"><a href="#parameters">4. Parameters</a></div> <div class="fancy-toc1"><a href="#the_like_glob_regexp_and_match_operators">5. The LIKE, GLOB, REGEXP, and MATCH operators</a></div> <div class="fancy-toc1"><a href="#the_between_operator">6. The BETWEEN operator</a></div> <div class="fancy-toc1"><a href="#the_case_expression">7. The CASE expression</a></div> <div class="fancy-toc1"><a href="#the_in_and_not_in_operators">8. The IN and NOT IN operators</a></div> <div class="fancy-toc1"><a href="#table_column_names">9. Table Column Names</a></div> <div class="fancy-toc1"><a href="#the_exists_operator">10. The EXISTS operator</a></div> <div class="fancy-toc1"><a href="#subquery_expressions">11. Subquery Expressions</a></div> <div class="fancy-toc1"><a href="#correlated_subqueries">12. Correlated Subqueries</a></div> <div class="fancy-toc1"><a href="#cast_expressions">13. CAST expressions</a></div> <div class="fancy-toc1"><a href="#boolean_expressions">14. Boolean Expressions</a></div> <div class="fancy-toc1"><a href="#functions">15. Functions</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1665' onclick='hideorshow("x1665","x1666")'>hide</button></p> <div id='x1666' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1667' onclick='hideorshow("x1667","x1668")'>show</button></p> <div id='x1668' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1669' onclick='hideorshow("x1669","x1670")'>show</button></p> <div id='x1670' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1671' onclick='hideorshow("x1671","x1672")'>show</button></p> <div id='x1672' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1673' onclick='hideorshow("x1673","x1674")'>show</button></p> <div id='x1674' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1675' onclick='hideorshow("x1675","x1676")'>show</button></p> <div id='x1676' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1677' onclick='hideorshow("x1677","x1678")'>show</button></p> <div id='x1678' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1679' onclick='hideorshow("x1679","x1680")'>show</button></p> <div id='x1680' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1681' onclick='hideorshow("x1681","x1682")'>show</button></p> <div id='x1682' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1683' onclick='hideorshow("x1683","x1684")'>show</button></p> <div id='x1684' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1685' onclick='hideorshow("x1685","x1686")'>show</button></p> <div id='x1686' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1687' onclick='hideorshow("x1687","x1688")'>show</button></p> <div id='x1688' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1689' onclick='hideorshow("x1689","x1690")'>show</button></p> <div id='x1690' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1691' onclick='hideorshow("x1691","x1692")'>show</button></p> <div id='x1692' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1693' onclick='hideorshow("x1693","x1694")'>show</button></p> <div id='x1694' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1695' onclick='hideorshow("x1695","x1696")'>show</button></p> <div id='x1696' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1697' onclick='hideorshow("x1697","x1698")'>show</button></p> <div id='x1698' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1699' onclick='hideorshow("x1699","x1700")'>show</button></p> <div id='x1700' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1701' onclick='hideorshow("x1701","x1702")'>show</button></p> <div id='x1702' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1703' onclick='hideorshow("x1703","x1704")'>show</button></p> <div id='x1704' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <a name="binaryops"></a> <h1 id="operators"><span>2. </span>Operators</h1> <p>SQLite understands the following binary operators, in order from highest to lowest precedence:</p> <blockquote><pre> <font color="#2c2cf0"><big>|| * / % + - |
262 263 264 265 266 267 268 | IS operator evaluates to 1 (true) and the IS NOT operator evaluates to 0 (false). If one operand is NULL and the other is not, then the IS operator evaluates to 0 (false) and the IS NOT operator is 1 (true). It is not possible for an IS or IS NOT expression to evaluate to NULL. Operators <font color="#2c2cf0"><big>IS</big></font> and <font color="#2c2cf0"><big>IS NOT</big></font> have the same precedence as <font color="#2c2cf0"><big>=</big></font>.<a name="litvalue"></a> | | | | 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 | IS operator evaluates to 1 (true) and the IS NOT operator evaluates to 0 (false). If one operand is NULL and the other is not, then the IS operator evaluates to 0 (false) and the IS NOT operator is 1 (true). It is not possible for an IS or IS NOT expression to evaluate to NULL. Operators <font color="#2c2cf0"><big>IS</big></font> and <font color="#2c2cf0"><big>IS NOT</big></font> have the same precedence as <font color="#2c2cf0"><big>=</big></font>.<a name="litvalue"></a> </p><h1 id="literal_values_constants_"><span>3. </span>Literal Values (Constants)</h1> <p> A literal value represents a constant. Literal values may be integers, floating point numbers, strings, BLOBs, or NULLs. </p><p> The syntax for integer and floating point literals (collectively "numeric literals") is shown by the following diagram:</p> <p><b><a href="syntax/numeric-literal.html">numeric-literal:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram numeric-literal" src="images/syntax/numeric-literal.gif"></img> </div> |
290 291 292 293 294 295 296 | The "." character is always used as the decimal point even if the locale setting specifies "," for this role - the use of "," for the decimal point would result in syntactic ambiguity. <a name="hexint"></a> | | | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 | The "." character is always used as the decimal point even if the locale setting specifies "," for this role - the use of "," for the decimal point would result in syntactic ambiguity. <a name="hexint"></a> </p><p>Hexadecimal integer literals follow the C-language notation of "0x" or "0X" followed by hexadecimal digits. For example, 0x1234 means the same as 4660 and 0x8000000000000000 means the same as -9223372036854775808. Hexadecimal integer literals are interpreted as 64-bit two's-complement integers and are thus limited to sixteen significant digits of precision. Support for hexadecimal integers was added to SQLite |
315 316 317 318 319 320 321 | string value in the format of a hexadecimal integer into an integer value, the conversion process stops when the 'x' character is seen so the resulting integer value is always zero. SQLite only understands the hexadecimal integer notation when it appears in the SQL statement text, not when it appears as part of the content of the database. | | | | | | 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 | string value in the format of a hexadecimal integer into an integer value, the conversion process stops when the 'x' character is seen so the resulting integer value is always zero. SQLite only understands the hexadecimal integer notation when it appears in the SQL statement text, not when it appears as part of the content of the database. </p><p> A string constant is formed by enclosing the string in single quotes ('). A single quote within the string can be encoded by putting two single quotes in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL. </p><p> BLOB literals are string literals containing hexadecimal data and preceded by a single "x" or "X" character. Example: X'53514C697465' </p><p> A literal value can also be the token "NULL". </p> <a name="varparam"></a> <h1 id="parameters"><span>4. </span>Parameters</h1> <p> A "variable" or "parameter" token specifies a placeholder in the expression for a value that is filled in at runtime using the <a href="c3ref/bind_blob.html">sqlite3_bind()</a> family of C/C++ interfaces. Parameters can take several forms: </p> |
400 401 402 403 404 405 406 | the <a href="limits.html#max_variable_number">SQLITE_MAX_VARIABLE_NUMBER</a> macro. An individual <a href="c3ref/sqlite3.html">database connection</a> D can reduce its maximum parameter number below the compile-time maximum using the <a href="c3ref/limit.html">sqlite3_limit</a>(D, <a href="c3ref/c_limit_attached.html#sqlitelimitvariablenumber">SQLITE_LIMIT_VARIABLE_NUMBER</a>,...) interface. </p> <a name="like"></a> | | | 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 | the <a href="limits.html#max_variable_number">SQLITE_MAX_VARIABLE_NUMBER</a> macro. An individual <a href="c3ref/sqlite3.html">database connection</a> D can reduce its maximum parameter number below the compile-time maximum using the <a href="c3ref/limit.html">sqlite3_limit</a>(D, <a href="c3ref/c_limit_attached.html#sqlitelimitvariablenumber">SQLITE_LIMIT_VARIABLE_NUMBER</a>,...) interface. </p> <a name="like"></a> <h1 id="the_like_glob_regexp_and_match_operators"><span>5. </span>The LIKE, GLOB, REGEXP, and MATCH operators</h1> <p>The LIKE operator does a pattern matching comparison. The operand to the right of the LIKE operator contains the pattern and the left hand operand contains the string to match against the pattern. A percent symbol ("%") in the LIKE pattern matches any sequence of zero or more characters in the string. An underscore ("_") in the LIKE pattern matches any single character in the |
429 430 431 432 433 434 435 | a single character. This character may be used in the LIKE pattern to include literal percent or underscore characters. The escape character followed by a percent symbol (%), underscore (_), or a second instance of the escape character itself matches a literal percent symbol, underscore, or a single escape character, respectively. | | | | 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 | a single character. This character may be used in the LIKE pattern to include literal percent or underscore characters. The escape character followed by a percent symbol (%), underscore (_), or a second instance of the escape character itself matches a literal percent symbol, underscore, or a single escape character, respectively. </p><p>The infix LIKE operator is implemented by calling the application-defined SQL functions <a href="lang_corefunc.html#like">like(<i>Y</i>,<i>X</i>)</a> or <a href="lang_corefunc.html#like">like(<i>Y</i>,<i>X</i>,<i>Z</i>)</a>.</p> <p>The LIKE operator can be made case sensitive using the <a href="pragma.html#pragma_case_sensitive_like">case_sensitive_like pragma</a>.</p> <a name="glob"></a> <p>The GLOB operator is similar to LIKE but uses the Unix |
465 466 467 468 469 470 471 | application-defined function. The default match() function implementation raises an exception and is not really useful for anything. But extensions can override the match() function with more helpful logic.</p> <a name="between"></a> | | | | | > | | | | | > > | | | | | > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | < | < > | | | | | | | | | | | | 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 | application-defined function. The default match() function implementation raises an exception and is not really useful for anything. But extensions can override the match() function with more helpful logic.</p> <a name="between"></a> <h1 id="the_between_operator"><span>6. </span>The BETWEEN operator</h1> <p>The BETWEEN operator is logically equivalent to a pair of comparisons. "<i>x</i> <b>BETWEEN</b> <i>y</i> <b>AND</b> <i>z</i>" is equivalent to "<i>x</i><b>>=</b><i>y</i> <b>AND</b> <i>x</i><b><=</b><i>z</i>" except that with BETWEEN, the <i>x</i> expression is only evaluated once. The precedence of the BETWEEN operator is the same as the precedence as operators <b>==</b> and <b>!=</b> and <b>LIKE</b> and groups left to right. <a name="case"></a> </p><h1 id="the_case_expression"><span>7. </span>The CASE expression</h1> <p>A CASE expression serves a role similar to IF-THEN-ELSE in other programming languages. </p><p>The optional expression that occurs in between the CASE keyword and the first WHEN keyword is called the "base" expression. There are two fundamental forms of the CASE expression: those with a base expression and those without. </p><p>In a CASE without a base expression, each WHEN expression is evaluated and the result treated as a boolean, starting with the leftmost and continuing to the right. The result of the CASE expression is the evaluation of the THEN expression that corresponds to the first WHEN expression that evaluates to true. Or, if none of the WHEN expressions evaluate to true, the result of evaluating the ELSE expression, if any. If there is no ELSE expression and none of the WHEN expressions are true, then the overall result is NULL. </p><p>A NULL result is considered untrue when evaluating WHEN terms. </p><p>In a CASE with a base expression, the base expression is evaluated just once and the result is compared against the evaluation of each WHEN expression from left to right. The result of the CASE expression is the evaluation of the THEN expression that corresponds to the first WHEN expression for which the comparison is true. Or, if none of the WHEN expressions evaluate to a value equal to the base expression, the result of evaluating the ELSE expression, if any. If there is no ELSE expression and none of the WHEN expressions produce a result equal to the base expression, the overall result is NULL. </p><p>When comparing a base expression against a WHEN expression, the same collating sequence, affinity, and NULL-handling rules apply as if the base expression and WHEN expression are respectively the left- and right-hand operands of an <big><b>=</b></big> operator.</p> <p>If the base expression is NULL then the result of the CASE is always the result of evaluating the ELSE expression if it exists, or NULL if it does not. </p><p>Both forms of the CASE expression use lazy, or short-circuit, evaluation. </p><p>The only difference between the following two CASE expressions is that the <i>x</i> expression is evaluated exactly once in the first example but might be evaluated multiple times in the second: </p><ul><pre> <li>CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END </li><li>CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END </li></pre></ul> <p>The built-in <a href="lang_corefunc.html#iif">iif(x,y,z) SQL function</a> is logically equivalent to "CASE WHEN x THEN y ELSE z END". The iif() function is found in SQL Server and is included in SQLite for compatibility. Some developers prefer the iif() function because it is more concise. <a name="in_op"></a> </p><h1 id="the_in_and_not_in_operators"><span>8. </span>The IN and NOT IN operators</h1> <p>The IN and NOT IN operators take an expression on the left and a list of values or a subquery on the right. When the right operand of an IN or NOT IN operator is a subquery, the subquery must have the same number of columns as there are columns in the <a href="rowvalue.html">row value</a> of the left operand. The subquery on the right of an IN or NOT IN operator must be a scalar subquery if the left expression is not a <a href="rowvalue.html">row value</a> expression. If the right operand of an IN or NOT IN operator is a list of values, each of those values must be scalars and the left expression must also be a scalar. The right-hand side of an IN or NOT IN operator can be a table <i>name</i> or <a href="vtab.html#tabfunc2">table-valued function</a> <i>name</i> in which case the right-hand side is understood to be subquery of the form "(SELECT * FROM <i>name</i>)". When the right operand is an empty set, the result of IN is false and the result of NOT IN is true, regardless of the left operand and even if the left operand is NULL. </p><p>The result of an IN or NOT IN operator is determined by the following matrix: </p><blockquote> <table border="1"> <tr> <th>Left operand <br>is NULL </th><th>Right operand <br>contains NULL </th><th>Right operand <br>is an empty set </th><th>Left operand found <br>within right operand </th><th>Result of <br>IN operator </th><th>Result of <br>NOT IN operator </th></tr><tr> <td align="center">no </td><td align="center">no </td><td align="center">no </td><td align="center">no </td><td align="center">false </td><td align="center">true </td></tr><tr> <td align="center">does not matter </td><td align="center">no </td><td align="center">yes </td><td align="center">no </td><td align="center">false </td><td align="center">true </td></tr><tr> <td align="center">no </td><td align="center">does not matter </td><td align="center">no </td><td align="center">yes </td><td align="center">true </td><td align="center">false </td></tr><tr> <td align="center">no </td><td align="center">yes </td><td align="center">no </td><td align="center">no </td><td align="center">NULL </td><td align="center">NULL </td></tr><tr> <td align="center">yes </td><td align="center">does not matter </td><td align="center">no </td><td align="center">does not matter </td><td align="center">NULL </td><td align="center">NULL </td></tr></table> </blockquote> <p>Note that SQLite allows the parenthesized list of scalar values on the right-hand side of an IN or NOT IN operator to be an empty list but most other SQL database database engines and the SQL92 standard require the list to contain at least one element.</p> <h1 id="table_column_names"><span>9. </span>Table Column Names</h1> <p>A column name can be any of the names defined in the <a href="lang_createtable.html">CREATE TABLE</a> statement or one of the following special identifiers: "<b>ROWID</b>", "<b>OID</b>", or "<b>_ROWID_</b>". The three special identifiers describe the unique integer key (the <a href="lang_createtable.html#rowid">rowid</a>) associated with every row of every table and so are not available on <a href="withoutrowid.html">WITHOUT ROWID</a> tables. The special identifiers only refer to the row key if the <a href="lang_createtable.html">CREATE TABLE</a> statement does not define a real column with the same name. The rowid can be used anywhere a regular column can be used.</p> <a name="exists_op"></a> <h1 id="the_exists_operator"><span>10. </span>The EXISTS operator</h1> <p>The EXISTS operator always evaluates to one of the integer values 0 and 1. If executing the SELECT statement specified as the right-hand operand of the EXISTS operator would return one or more rows, then the EXISTS operator evaluates to 1. If executing the SELECT would return no rows at all, then the EXISTS operator evaluates to 0. </p><p>The number of columns in each row returned by the SELECT statement (if any) and the specific values returned have no effect on the results of the EXISTS operator. In particular, rows containing NULL values are not handled any differently from rows without NULL values. <a name="subq"></a> </p><h1 id="subquery_expressions"><span>11. </span>Subquery Expressions</h1> <p>A <a href="lang_select.html">SELECT</a> statement enclosed in parentheses is a subquery. All types of SELECT statement, including aggregate and compound SELECT queries (queries with keywords like UNION or EXCEPT) are allowed as scalar subqueries. The value of a subquery expression is the first row of the result from the enclosed <a href="lang_select.html">SELECT</a> statement. The value of a subquery expression is NULL if the enclosed <a href="lang_select.html">SELECT</a> statement returns no rows. </p><p>A subquery that returns a single column is a scalar subquery and can be used most anywhere. A subquery that returns two or more columns is a <a href="rowvalue.html">row value</a> subquery and can only be used as the operand of a comparison operator. <a name="cosub"></a> </p><h1 id="correlated_subqueries"><span>12. </span>Correlated Subqueries</h1> <p>A <a href="lang_select.html">SELECT</a> statement used as either a scalar subquery or as the right-hand operand of an IN, NOT IN or EXISTS expression may contain references to columns in the outer query. Such a subquery is known as a correlated subquery. A correlated subquery is reevaluated each time its result is required. An uncorrelated subquery is evaluated only once and the result reused as necessary. <a name="castexpr"></a> </p><h1 id="cast_expressions"><span>13. </span>CAST expressions</h1> <p>A CAST expression of the form "CAST(<i>expr</i> AS <i>type-name</i>)" is used to convert the value of <i>expr</i> to a different <a href="datatype3.html#storageclasses">storage class</a> specified by <span class='yyterm'>type-name</span>. A CAST conversion is similar to the conversion that takes place when a <a href="datatype3.html#affinity">column affinity</a> is applied to a value except that with the CAST operator the conversion always takes place even if the conversion lossy and irreversible, whereas column affinity only changes the data type of a value if the change is lossless and reversible. </p><p>If the value of <i>expr</i> is NULL, then the result of the CAST expression is also NULL. Otherwise, the storage class of the result is determined by applying the <a href="datatype3.html#affname">rules for determining column affinity</a> to the <span class='yyterm'>type-name</span>. </p><blockquote> <table border="1"> <tr> <th> Affinity of <span class='yyterm'><nobr>type-name</nobr></span> </th><th> Conversion Processing </th></tr><tr> <td> NONE </td><td> Casting a value to a <span class='yyterm'>type-name</span> with no affinity causes the value to be converted into a BLOB. Casting to a BLOB consists of first casting the value to TEXT in the <a href="pragma.html#pragma_encoding">encoding</a> of the database connection, then interpreting the resulting byte sequence as a BLOB instead of as TEXT. </td></tr><tr> <td> TEXT </td><td> To cast a BLOB value to TEXT, the sequence of bytes that make up the BLOB is interpreted as text encoded using the database encoding. <p> Casting an INTEGER or REAL value into TEXT renders the value as if via <a href="c3ref/mprintf.html">sqlite3_snprintf()</a> except that the resulting TEXT uses the <a href="pragma.html#pragma_encoding">encoding</a> of the database connection. </p></td></tr><tr> <td> REAL </td><td> When casting a BLOB value to a REAL, the value is first converted to TEXT. <p>When casting a TEXT value to REAL, the longest possible prefix of the value that can be interpreted as a real number is extracted from the TEXT value and the remainder ignored. Any leading spaces in the TEXT value are ignored when converging from TEXT to REAL. If there is no prefix that can be interpreted as a real number, the result of the conversion is 0.0. </p></td></tr><tr> <td> INTEGER </td><td> When casting a BLOB value to INTEGER, the value is first converted to TEXT. <p>When casting a TEXT value to INTEGER, the longest possible prefix of the value that can be interpreted as an integer number is extracted from the TEXT value and the remainder ignored. Any leading spaces in the TEXT value when converting from TEXT to INTEGER are ignored. If there is no prefix that can be interpreted as an integer number, the result of the conversion is 0. If the prefix integer is greater than +9223372036854775807 then the result of the cast is exactly +9223372036854775807. Similarly, if the prefix integer is less than -9223372036854775808 then the result of the cast is exactly -9223372036854775808. </p><p>When casting to INTEGER, if the text looks like a floating point value with an exponent, the exponent will be ignored because it is no part of the integer prefix. For example, "(CAST '123e+5' AS INTEGER)" results in 123, not in 12300000. </p><p> The CAST operator understands decimal integers only — conversion of <a href="lang_expr.html#hexint">hexadecimal integers</a> stops at the "x" in the "0x" prefix of the hexadecimal integer string and thus result of the CAST is always zero. </p><p>A cast of a REAL value into an INTEGER results in the integer between the REAL value and zero that is closest to the REAL value. If a REAL is greater than the greatest possible signed integer (+9223372036854775807) then the result is the greatest possible signed integer and if the REAL is less than the least possible signed integer (-9223372036854775808) then the result is the least possible signed integer. </p><p>Prior to SQLite version 3.8.2 (2013-12-06), casting a REAL value greater than +9223372036854775807.0 into an integer resulted in the most negative integer, -9223372036854775808. This behavior was meant to emulate the behavior of x86/x64 hardware when doing the equivalent cast. </p></td></tr><tr> <td> NUMERIC </td><td> Casting a TEXT or BLOB value into NUMERIC yields either an INTEGER or a REAL result. If the input text looks like an integer (there is no decimal point nor exponent) and the value is small enough to fit in a 64-bit signed integer, then the result will be INTEGER. Input text that looks like floating point (there is a decimal point and/or an exponent) and the text describes a value that can be losslessly converted back and forth between IEEE 754 64-bit float and a 51-bit signed integer, then the result is INTEGER. (In the previous sentence, a 51-bit integer is specified since that is one bit less than the length of the mantissa of an IEEE 754 64-bit float and thus provides a 1-bit of margin for the text-to-float conversion operation.) Any text input that describes a value outside the range of a 64-bit signed integer yields a REAL result. <p> Casting a REAL or INTEGER value to NUMERIC is a no-op, even if a real value could be losslessly converted to an integer. </p></td></tr> </table> </blockquote> <p>Note that the result from casting any non-BLOB value into a BLOB and the result from casting any BLOB value into a non-BLOB value may be different depending on whether the database <a href="pragma.html#pragma_encoding">encoding</a> is UTF-8, UTF-16be, or UTF-16le. <a name="booleanexpr"></a> </p><h1 id="boolean_expressions"><span>14. </span>Boolean Expressions</h1> <p>The SQL language features several contexts where an expression is evaluated and the result converted to a boolean (true or false) value. These contexts are: </p><ul> <li> the WHERE clause of a SELECT, UPDATE or DELETE statement, </li><li> the ON or USING clause of a join in a SELECT statement, </li><li> the HAVING clause of a SELECT statement, </li><li> the WHEN clause of an SQL trigger, and </li><li> the WHEN clause or clauses of some CASE expressions. </li></ul> <p>To convert the results of an SQL expression to a boolean value, SQLite first casts the result to a NUMERIC value in the same way as a <a href="lang_expr.html#castexpr">CAST expression</a>. A numeric zero value (integer value 0 or real value 0.0) is considered to be false. A NULL value is still NULL. All other values are considered true. </p><p>For example, the values NULL, 0.0, 0, 'english' and '0' are all considered to be false. Values 1, 1.0, 0.1, -0.1 and '1english' are considered to be true. </p><p>Beginning with SQLite 3.23.0 (2018-04-02), SQLite recognizes the identifiers "TRUE" and "FALSE" as boolean literals, if and only if those identifiers are not already used for some other meaning. If there already exists columns or tables or other objects named TRUE or FALSE, then for the sake of backwards compatibility, the TRUE and FALSE identifiers refer to those other objects, not to the boolean values. </p><p>The boolean identifiers TRUE and FALSE are usually just aliases for the integer values 1 and 0, respectively. However, if TRUE or FALSE occur on the right-hand side of an IS operator, then they form new unary postfix operators "IS TRUE" and "IS FALSE" which test the boolean value of the operand on the left. </p><h1 id="functions"><span>15. </span>Functions</h1> <p>SQLite supports many <a href="lang_corefunc.html">simple</a>, <a href="lang_aggfunc.html">aggregate</a>, and <a href="windowfunctions.html">window</a> SQL functions. For presentation purposes, simple functions are further subdivided into <a href="lang_corefunc.html">core functions</a>, <a href="lang_datefunc.html">date-time functions</a>, and <a href="json1.html">JSON functions</a>. Applications can add new functions, written in C/C++, using the <a href="c3ref/create_function.html">sqlite3_create_function()</a> interface. |
841 842 843 844 845 846 847 | <img alt="syntax diagram aggregate-function-invocation" src="images/syntax/aggregate-function-invocation.gif"></img> </div> <p><b><a href="syntax/window-function-invocation.html">window-function-invocation:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram window-function-invocation" src="images/syntax/window-function-invocation.gif"></img> </div> | | | | < | 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 | <img alt="syntax diagram aggregate-function-invocation" src="images/syntax/aggregate-function-invocation.gif"></img> </div> <p><b><a href="syntax/window-function-invocation.html">window-function-invocation:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram window-function-invocation" src="images/syntax/window-function-invocation.gif"></img> </div> </p><p> The OVER clause is required for <a href="windowfunctions.html">window functions</a> and is prohibited otherwise. The DISTINCT keyword is only allowed in <a href="lang_aggfunc.html">aggregate functions</a>. The FILTER clause may not appear on a <a href="lang_corefunc.html">simple function</a>. </p><p>It is possible to have an aggregate function with the same name as a simple function, as long as the number of arguments for the two forms of the function are different. For example, the <a href="lang_aggfunc.html#maxggunc">max()</a> function with a single argument is an aggregate and the <a href="lang_corefunc.html#maxoreunc">max()</a> function with two or more arguments is a simple function. Aggregate functions can usually also be used as window functions. </p> |
Changes to Doc/Extra/Core/lang_indexedby.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>The INDEXED BY Clause</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > > > > | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> The INDEXED BY Clause </div> </div> <h1 id="how_indexed_by_works"><span>1. </span>How INDEXED BY Works</h1> <p>The INDEXED BY phrase forces the <a href="optoverview.html">SQLite query planner</a> to use a particular named index on a <a href="lang_delete.html">DELETE</a>, <a href="lang_select.html">SELECT</a>, or <a href="lang_update.html">UPDATE</a> statement. The INDEXED BY phrase is an SQLite extension and is not portable to other SQL database engines.</p> <p><b><a href="syntax/qualified-table-name.html">qualified-table-name:</a></b> <button id='x1705' onclick='hideorshow("x1705","x1706")'>hide</button></p> <div id='x1706' class='imgcontainer'> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif" /> </div> <p>The "INDEXED BY <span class='yyterm'>index-name</span>" phrase specifies that the named index must be used in order to look up values on the preceding table. |
131 132 133 134 135 136 137 | undesirable query plan changes during regression testing. Application developers are admonished to omit all use of INDEXED BY during application design, implementation, testing, and tuning. If INDEXED BY is to be used at all, it should be inserted at the very end of the development process when "locking down" a design.</p> | | | | | < | 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 | undesirable query plan changes during regression testing. Application developers are admonished to omit all use of INDEXED BY during application design, implementation, testing, and tuning. If INDEXED BY is to be used at all, it should be inserted at the very end of the development process when "locking down" a design.</p> <h1 id="see_also"><span>2. </span>See Also</h1> <ol> <li><p>The <a href="queryplanner-ng.html#howtofix">query planner checklist</a> describes steps that application developers should following to help resolve query planner problems. Notice the that the use of INDEXED BY is a last resort, to be used only when all other measures fail.</p> </li><li><p><a href="optoverview.html#uplus">The unary "+" operator</a> can be used to disqualify terms in the WHERE clause from use by indices. Careful use of unary + can sometimes help prevent the query planner from choosing a poor index without restricting it to using one specific index. Careful placement of unary + operators is a better method for controlling which indices are used by a query.</p> </li><li><p>The <a href="c3ref/stmt_status.html">sqlite3_stmt_status()</a> C/C++ interface together with the <a href="c3ref/c_stmtstatus_counter.html#sqlitestmtstatusfullscanstep">SQLITE_STMTSTATUS_FULLSCAN_STEP</a> and <a href="c3ref/c_stmtstatus_counter.html#sqlitestmtstatussort">SQLITE_STMTSTATUS_SORT</a> verbs can be used to detect at run-time when an SQL statement is not making effective use of indices. Many applications may prefer to use the <a href="c3ref/stmt_status.html">sqlite3_stmt_status()</a> interface to detect index misuse rather than the INDEXED BY phrase described here.</p> </li></ol> |
Changes to Doc/Extra/Core/lang_insert.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>INSERT</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> INSERT </div> </div> <p><b><a href="syntax/insert-stmt.html">insert-stmt:</a></b> <button id='x1707' onclick='hideorshow("x1707","x1708")'>hide</button></p> <div id='x1708' class='imgcontainer'> <img alt="syntax diagram insert-stmt" src="images/syntax/insert-stmt.gif" /> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1709' onclick='hideorshow("x1709","x1710")'>show</button></p> <div id='x1710' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1711' onclick='hideorshow("x1711","x1712")'>show</button></p> <div id='x1712' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1713' onclick='hideorshow("x1713","x1714")'>show</button></p> <div id='x1714' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1715' onclick='hideorshow("x1715","x1716")'>show</button></p> <div id='x1716' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1717' onclick='hideorshow("x1717","x1718")'>show</button></p> <div id='x1718' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1719' onclick='hideorshow("x1719","x1720")'>show</button></p> <div id='x1720' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1721' onclick='hideorshow("x1721","x1722")'>show</button></p> <div id='x1722' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1723' onclick='hideorshow("x1723","x1724")'>show</button></p> <div id='x1724' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1725' onclick='hideorshow("x1725","x1726")'>show</button></p> <div id='x1726' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1727' onclick='hideorshow("x1727","x1728")'>show</button></p> <div id='x1728' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1729' onclick='hideorshow("x1729","x1730")'>show</button></p> <div id='x1730' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1731' onclick='hideorshow("x1731","x1732")'>show</button></p> <div id='x1732' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1733' onclick='hideorshow("x1733","x1734")'>show</button></p> <div id='x1734' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1735' onclick='hideorshow("x1735","x1736")'>show</button></p> <div id='x1736' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1737' onclick='hideorshow("x1737","x1738")'>show</button></p> <div id='x1738' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1739' onclick='hideorshow("x1739","x1740")'>show</button></p> <div id='x1740' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1741' onclick='hideorshow("x1741","x1742")'>show</button></p> <div id='x1742' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1743' onclick='hideorshow("x1743","x1744")'>show</button></p> <div id='x1744' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1745' onclick='hideorshow("x1745","x1746")'>show</button></p> <div id='x1746' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1747' onclick='hideorshow("x1747","x1748")'>show</button></p> <div id='x1748' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/upsert-clause.html">upsert-clause:</a></b> <button id='x1749' onclick='hideorshow("x1749","x1750")'>show</button></p> <div id='x1750' style='display:none;' class='imgcontainer'> <img alt="syntax diagram upsert-clause" src="images/syntax/upsert-clause.gif" /> <p><b><a href="syntax/column-name-list.html">column-name-list:</a></b> <button id='x1751' onclick='hideorshow("x1751","x1752")'>show</button></p> <div id='x1752' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-name-list" src="images/syntax/column-name-list.gif" /> </div> <p><b><a href="syntax/indexed-column.html">indexed-column:</a></b> <button id='x1753' onclick='hideorshow("x1753","x1754")'>show</button></p> <div id='x1754' style='display:none;' class='imgcontainer'> <img alt="syntax diagram indexed-column" src="images/syntax/indexed-column.gif" /> </div> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x1755' onclick='hideorshow("x1755","x1756")'>show</button></p> <div id='x1756' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x1757' onclick='hideorshow("x1757","x1758")'>show</button></p> <div id='x1758' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> </div> </div> <p>The INSERT statement comes in three basic forms. </p><ol> <li><p><b>INSERT INTO </b><i>table</i><b> VALUES(...);</b> </p><p>The first form (with the "VALUES" keyword) creates one or more new rows in an existing table. If the <span class='yyterm'>column-name</span> list after <span class='yyterm'>table-name</span> is omitted then the number of values inserted into each row must be the same as the number of columns in the table. In this case the result of evaluating the left-most expression from each term of the VALUES list is inserted into the left-most column of each new row, and so forth for each subsequent expression. If a <span class='yyterm'>column-name</span> list is specified, then the number of values in each term of the VALUE list must match the number of specified columns. Each of the named columns of the new row is populated with the results of evaluating the corresponding VALUES expression. Table columns that do not appear in the column list are populated with the <a href="lang_createtable.html#dfltval">default column value</a> (specified as part of the <a href="lang_createtable.html">CREATE TABLE</a> statement), or with NULL if no <a href="lang_createtable.html#dfltval">default value</a> is specified. </p></li><li><p><b>INSERT INTO </b><i>table</i><b> SELECT ...;</b> </p><p>The second form of the INSERT statement contains a <a href="lang_select.html">SELECT</a> statement instead of a VALUES clause. A new entry is inserted into the table for each row of data returned by executing the SELECT statement. If a column-list is specified, the number of columns in the result of the SELECT must be the same as the number of items in the column-list. Otherwise, if no column-list is specified, the number of columns in the result of the SELECT must be the same as the number of columns in the table. Any SELECT statement, including <a href="lang_select.html#compound">compound SELECTs</a> and SELECT statements with <a href="lang_select.html#orderby">ORDER BY</a> and/or <a href="lang_select.html#limitoffset">LIMIT</a> clauses, may be used in an INSERT statement of this form. </p><p>To avoid a parsing ambiguity, the SELECT statement should always contain a WHERE clause, even if that clause is simply "WHERE true", if the <a href="syntax/upsert-clause.html">upsert-clause</a> is present. Without the WHERE clause, the parser does not know if the token "ON" is part of a join constraint on the SELECT, or the beginning of the <a href="syntax/upsert-clause.html">upsert-clause</a>. </p></li><li><p><b>INSERT INTO </b><i>table</i><b> DEFAULT VALUES;</b> </p><p>The third form of an INSERT statement is with DEFAULT VALUES. The INSERT ... DEFAULT VALUES statement inserts a single new row into the named table. Each column of the new row is populated with its <a href="lang_createtable.html#dfltval">default value</a>, or with a NULL if no default value is specified as part of the column definition in the <a href="lang_createtable.html">CREATE TABLE</a> statement. The <a href="syntax/upsert-clause.html">upsert-clause</a> is not supported after DEFAULT VALUES. </p></li></ol> <p> The initial "INSERT" keyword can be replaced by "REPLACE" or "INSERT OR <i>action</i>" to specify an alternative constraint <a href="lang_conflict.html">conflict resolution algorithm</a> to use during that one INSERT command. For compatibility with MySQL, the parser allows the use of the single keyword <a href="lang_replace.html">REPLACE</a> as an alias for "INSERT OR REPLACE". </p><p>The optional "<i>schema-name</i><b>.</b>" prefix on the <span class='yyterm'>table-name</span> is supported for top-level INSERT statements only. The table name must be unqualified for INSERT statements that occur within <a href="lang_createtrigger.html">CREATE TRIGGER</a> statements. Similarly, the "DEFAULT VALUES" form of the INSERT statement is supported for top-level INSERT statements only and not for INSERT statements within triggers. </p><p> </p><p>The optional "AS <span class='yyterm'>alias</span>" phrase provides an alternative name for the table into which content is being inserted. The alias name can be used within WHERE and SET clauses of the <a href="lang_upsert.html">UPSERT</a>. If there is no <a href="syntax/upsert-clause.html">upsert-clause</a>, then the <span class='yyterm'>alias</span> is pointless, but also harmless. </p><p>See the separate <a href="lang_upsert.html">UPSERT</a> documentation for the additional trailing syntax that can cause an INSERT to behave as an UPDATE if the INSERT would otherwise violate a uniqueness constraint. The <a href="lang_upsert.html">upsert clause</a> is not allowed on an "INSERT ... DEFAULT VALUES". </p> |
Changes to Doc/Extra/Core/lang_keywords.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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 Keywords</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > > | | | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> SQLite Keywords </div> </div> <p>The SQL standard specifies a large number of keywords which may not be used as the names of tables, indices, columns, databases, user-defined functions, collations, virtual table modules, or any other named object. The list of keywords is so long that few people can remember them all. For most SQL code, your safest bet is to never use any English language word as the name of a user-defined object.</p> <p>If you want to use a keyword as a name, you need to quote it. There are four ways of quoting keywords in SQLite:</p> <p> </p><blockquote> <table> <tr> <td valign="top"><b>'keyword'</b></td><td width="20"></td> <td>A keyword in single quotes is a string literal.</td></tr> <tr> <td valign="top"><b>"keyword"</b></td><td></td> <td>A keyword in double-quotes is an identifier.</td></tr> <tr> <td valign="top"><b>[keyword]</b></td><td></td> <td>A keyword enclosed in square brackets is an identifier. This is not standard SQL. This quoting mechanism is used by MS Access and SQL Server and is included in SQLite for compatibility.</td></tr> <tr> <td valign="top"><b>`keyword`</b></td><td></td> <td>A keyword enclosed in grave accents (ASCII code 96) is an identifier. This is not standard SQL. This quoting mechanism is used by MySQL and is included in SQLite for compatibility.</td></tr> </table> </blockquote> <p>For resilience when confronted with historical SQL statements, SQLite will sometimes bend the quoting rules above:</p> <ul> <li><p>If a keyword in single quotes (ex: <b>'key'</b> or <b>'glob'</b>) is used in a context where |
168 169 170 171 172 173 174 | <a href="c3ref/keyword_check.html">sqlite3_keyword_check()</a> interfaces to determine the keywords recognized by SQLite at run-time. Regardless of the compile-time configuration, any identifier that is not on the following 145 element list is not a keyword to the SQL parser in SQLite: </p> | | > | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | <a href="c3ref/keyword_check.html">sqlite3_keyword_check()</a> interfaces to determine the keywords recognized by SQLite at run-time. Regardless of the compile-time configuration, any identifier that is not on the following 145 element list is not a keyword to the SQL parser in SQLite: </p> <div class="columns" style="columns:11em auto;"> <ul style="padding-top:0;"> <li>ABORT</li> <li>ACTION</li> <li>ADD</li> <li>AFTER</li> <li>ALL</li> <li>ALTER</li> <li>ALWAYS</li> |
314 315 316 317 318 319 320 | <li>VIEW</li> <li>VIRTUAL</li> <li>WHEN</li> <li>WHERE</li> <li>WINDOW</li> <li>WITH</li> <li>WITHOUT</li> | | | | 324 325 326 327 328 329 330 331 332 333 | <li>VIEW</li> <li>VIRTUAL</li> <li>WHEN</li> <li>WHERE</li> <li>WINDOW</li> <li>WITH</li> <li>WITHOUT</li> </ul></div> </ul></div> |
Changes to Doc/Extra/Core/lang_naming.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Database Object Name Resolution</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | | > | 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 | }, 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; } </script> </div> <p> In SQLite, a database object (a table, index, trigger or view) is identified by the name of the object and the name of the database that it resides in. Database objects may reside in the main database, the temp database, or in an <a href="lang_attach.html">attached database</a>. |
133 134 135 136 137 138 139 140 | Most object references may only resolve to a specific type of object (for example a reference that is part of a DROP TABLE statement may only resolve to a table object, not an index, trigger or view). However in some contexts (e.g. <a href="lang_reindex.html">REINDEX</a>) an object reference may be resolve to more than one type of object. When searching database schemas for a named object, objects of types that cannot be used in the context of the reference are always ignored. | < | 134 135 136 137 138 139 140 141 | Most object references may only resolve to a specific type of object (for example a reference that is part of a DROP TABLE statement may only resolve to a table object, not an index, trigger or view). However in some contexts (e.g. <a href="lang_reindex.html">REINDEX</a>) an object reference may be resolve to more than one type of object. When searching database schemas for a named object, objects of types that cannot be used in the context of the reference are always ignored. |
Changes to Doc/Extra/Core/lang_reindex.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>REINDEX</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > | | | | > > | | | | < | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> REINDEX </div> </div> <p><b><a href="syntax/reindex-stmt.html">reindex-stmt:</a></b> <button id='x1759' onclick='hideorshow("x1759","x1760")'>hide</button></p> <div id='x1760' class='imgcontainer'> <img alt="syntax diagram reindex-stmt" src="images/syntax/reindex-stmt.gif" /> </div> <p>The REINDEX command is used to delete and recreate indices from scratch. This is useful when the definition of a collation sequence has changed, or when there are <a href="expridx.html">indexes on expressions</a> involving a function whose definition has changed. </p> <p>If the REINDEX keyword is not followed by a collation-sequence or database object identifier, then all indices in all attached databases are rebuilt. </p><p>If the REINDEX keyword is followed by a collation-sequence name, then all indices in all attached databases that use the named collation sequences are recreated. </p><p>Or, if the argument attached to the REINDEX identifies a specific database table, then all indices attached to the database table are rebuilt. If it identifies a specific database index, then just that index is recreated. </p><p>For a command of the form "REINDEX <i>name</i>", a match against <span class='yyterm'>collation-name</span> takes precedence over a match against <span class='yyterm'>index-name</span> or <span class='yyterm'>table-name</span>. This ambiguity in the syntax may be avoided by always specifying a <span class='yyterm'>schema-name</span> when reindexing a specific table or index. </p> |
Changes to Doc/Extra/Core/lang_replace.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>REPLACE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > | > > > > > > > | < | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> REPLACE </div> </div> <p>The REPLACE command is an alias for the "<a href="lang_conflict.html">INSERT OR REPLACE</a>" variant of the <a href="lang_insert.html">INSERT</a> command. This alias is provided for compatibility other SQL database engines. See the <a href="lang_insert.html">INSERT</a> command documentation for additional information.</p> |
Changes to Doc/Extra/Core/lang_savepoint.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Savepoints</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > | | | | | | | > > | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> Savepoints </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/savepoint-stmt.html">savepoint-stmt:</a></b> <button id='x1761' onclick='hideorshow("x1761","x1762")'>hide</button></p> <div id='x1762' class='imgcontainer'> <img alt="syntax diagram savepoint-stmt" src="images/syntax/savepoint-stmt.gif" /> </div> <p><b><a href="syntax/release-stmt.html">release-stmt:</a></b> <button id='x1763' onclick='hideorshow("x1763","x1764")'>hide</button></p> <div id='x1764' class='imgcontainer'> <img alt="syntax diagram release-stmt" src="images/syntax/release-stmt.gif" /> </div> <p><b><a href="syntax/rollback-stmt.html">rollback-stmt:</a></b> <button id='x1765' onclick='hideorshow("x1765","x1766")'>hide</button></p> <div id='x1766' class='imgcontainer'> <img alt="syntax diagram rollback-stmt" src="images/syntax/rollback-stmt.gif" /> </div> <h1 id="savepoints"><span>2. </span>Savepoints</h1> <p> SAVEPOINTs are a method of creating transactions, similar to <a href="lang_transaction.html">BEGIN</a> and <a href="lang_transaction.html">COMMIT</a>, except that the SAVEPOINT and RELEASE commands are named and may be nested.</p> <p> The SAVEPOINT command starts a new transaction with a name. The transaction names need not be unique. |
177 178 179 180 181 182 183 | erases marks from the timeline without actually making any changes to the database. </p></li> </ul> | | | 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | erases marks from the timeline without actually making any changes to the database. </p></li> </ul> <h1 id="transaction_nesting_rules"><span>3. </span>Transaction Nesting Rules</h1> <p>The last transaction started will be the first transaction committed or rolled back.</p> <p>The <a href="lang_transaction.html">BEGIN</a> command only works if the transaction stack is empty, or in other words if there are no pending transactions. If the transaction stack is not empty when the <a href="lang_transaction.html">BEGIN</a> command is invoked, then the command |
209 210 211 212 213 214 215 216 | <p>The ROLLBACK command with a TO clause rolls back transactions going backwards in time back to the most recent SAVEPOINT with a matching name. The SAVEPOINT with the matching name remains on the transaction stack, but all database changes that occurred after that SAVEPOINT was created are rolled back. If the savepoint-name in a ROLLBACK TO command does not match any SAVEPOINT on the stack, then the ROLLBACK command fails with an error and leaves the state of the database unchanged.</p> | < | 223 224 225 226 227 228 229 230 | <p>The ROLLBACK command with a TO clause rolls back transactions going backwards in time back to the most recent SAVEPOINT with a matching name. The SAVEPOINT with the matching name remains on the transaction stack, but all database changes that occurred after that SAVEPOINT was created are rolled back. If the savepoint-name in a ROLLBACK TO command does not match any SAVEPOINT on the stack, then the ROLLBACK command fails with an error and leaves the state of the database unchanged.</p> |
Changes to Doc/Extra/Core/lang_select.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>SELECT</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | < | | | | > > > > < < | | | | | | < < < < < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> SELECT </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#overview">1. Overview</a></div> <div class="fancy-toc1"><a href="#simple_select_processing">2. Simple Select Processing</a></div> <div class="fancy-toc1"><a href="#compound_select_statements">3. Compound Select Statements</a></div> <div class="fancy-toc1"><a href="#the_order_by_clause">4. The ORDER BY clause</a></div> <div class="fancy-toc1"><a href="#the_limit_clause">5. The LIMIT clause</a></div> <div class="fancy-toc1"><a href="#the_values_clause">6. The VALUES clause</a></div> <div class="fancy-toc1"><a href="#the_with_clause">7. The WITH Clause</a></div> <div class="fancy-toc1"><a href="#table_valued_functions_in_the_from_clause">8. Table-valued Functions In The FROM Clause</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1767' onclick='hideorshow("x1767","x1768")'>hide</button></p> <div id='x1768' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1769' onclick='hideorshow("x1769","x1770")'>show</button></p> <div id='x1770' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1771' onclick='hideorshow("x1771","x1772")'>show</button></p> <div id='x1772' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1773' onclick='hideorshow("x1773","x1774")'>show</button></p> <div id='x1774' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1775' onclick='hideorshow("x1775","x1776")'>show</button></p> <div id='x1776' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1777' onclick='hideorshow("x1777","x1778")'>show</button></p> <div id='x1778' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1779' onclick='hideorshow("x1779","x1780")'>show</button></p> <div id='x1780' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1781' onclick='hideorshow("x1781","x1782")'>show</button></p> <div id='x1782' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1783' onclick='hideorshow("x1783","x1784")'>show</button></p> <div id='x1784' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1785' onclick='hideorshow("x1785","x1786")'>show</button></p> <div id='x1786' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1787' onclick='hideorshow("x1787","x1788")'>show</button></p> <div id='x1788' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1789' onclick='hideorshow("x1789","x1790")'>show</button></p> <div id='x1790' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1791' onclick='hideorshow("x1791","x1792")'>show</button></p> <div id='x1792' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1793' onclick='hideorshow("x1793","x1794")'>show</button></p> <div id='x1794' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1795' onclick='hideorshow("x1795","x1796")'>show</button></p> <div id='x1796' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1797' onclick='hideorshow("x1797","x1798")'>show</button></p> <div id='x1798' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1799' onclick='hideorshow("x1799","x1800")'>show</button></p> <div id='x1800' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1801' onclick='hideorshow("x1801","x1802")'>show</button></p> <div id='x1802' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1803' onclick='hideorshow("x1803","x1804")'>show</button></p> <div id='x1804' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p>The SELECT statement is used to query the database. The result of a SELECT is zero or more rows of data where each row has a fixed number of columns. A SELECT statement does not make any changes to the database. </p><p>The "<a href="syntax/select-stmt.html">select-stmt</a>" syntax diagram above attempts to show as much of the SELECT statement syntax as possible in a single diagram, because some readers find that helpful. The following "<a href="syntax/factored-select-stmt.html">factored-select-stmt</a>" is an alternative syntax diagrams that expresses the same syntax but tries to break the syntax down into smaller chunks. <p><b><a href="syntax/factored-select-stmt.html">factored-select-stmt:</a></b> <button id='x1805' onclick='hideorshow("x1805","x1806")'>show</button></p> <div id='x1806' style='display:none;' class='imgcontainer'> <img alt="syntax diagram factored-select-stmt" src="images/syntax/factored-select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1807' onclick='hideorshow("x1807","x1808")'>show</button></p> <div id='x1808' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1809' onclick='hideorshow("x1809","x1810")'>show</button></p> <div id='x1810' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1811' onclick='hideorshow("x1811","x1812")'>show</button></p> <div id='x1812' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1813' onclick='hideorshow("x1813","x1814")'>show</button></p> <div id='x1814' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1815' onclick='hideorshow("x1815","x1816")'>show</button></p> <div id='x1816' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1817' onclick='hideorshow("x1817","x1818")'>show</button></p> <div id='x1818' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1819' onclick='hideorshow("x1819","x1820")'>show</button></p> <div id='x1820' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1821' onclick='hideorshow("x1821","x1822")'>show</button></p> <div id='x1822' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1823' onclick='hideorshow("x1823","x1824")'>show</button></p> <div id='x1824' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1825' onclick='hideorshow("x1825","x1826")'>show</button></p> <div id='x1826' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1827' onclick='hideorshow("x1827","x1828")'>show</button></p> <div id='x1828' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1829' onclick='hideorshow("x1829","x1830")'>show</button></p> <div id='x1830' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1831' onclick='hideorshow("x1831","x1832")'>show</button></p> <div id='x1832' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1833' onclick='hideorshow("x1833","x1834")'>show</button></p> <div id='x1834' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1835' onclick='hideorshow("x1835","x1836")'>show</button></p> <div id='x1836' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1837' onclick='hideorshow("x1837","x1838")'>show</button></p> <div id='x1838' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1839' onclick='hideorshow("x1839","x1840")'>show</button></p> <div id='x1840' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1841' onclick='hideorshow("x1841","x1842")'>show</button></p> <div id='x1842' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1843' onclick='hideorshow("x1843","x1844")'>show</button></p> <div id='x1844' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1845' onclick='hideorshow("x1845","x1846")'>show</button></p> <div id='x1846' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1847' onclick='hideorshow("x1847","x1848")'>show</button></p> <div id='x1848' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1849' onclick='hideorshow("x1849","x1850")'>show</button></p> <div id='x1850' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1851' onclick='hideorshow("x1851","x1852")'>show</button></p> <div id='x1852' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1853' onclick='hideorshow("x1853","x1854")'>show</button></p> <div id='x1854' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1855' onclick='hideorshow("x1855","x1856")'>show</button></p> <div id='x1856' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1857' onclick='hideorshow("x1857","x1858")'>show</button></p> <div id='x1858' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1859' onclick='hideorshow("x1859","x1860")'>show</button></p> <div id='x1860' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/select-core.html">select-core:</a></b> <button id='x1861' onclick='hideorshow("x1861","x1862")'>show</button></p> <div id='x1862' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-core" src="images/syntax/select-core.gif" /> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1863' onclick='hideorshow("x1863","x1864")'>show</button></p> <div id='x1864' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1865' onclick='hideorshow("x1865","x1866")'>show</button></p> <div id='x1866' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1867' onclick='hideorshow("x1867","x1868")'>show</button></p> <div id='x1868' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1869' onclick='hideorshow("x1869","x1870")'>show</button></p> <div id='x1870' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1871' onclick='hideorshow("x1871","x1872")'>show</button></p> <div id='x1872' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1873' onclick='hideorshow("x1873","x1874")'>show</button></p> <div id='x1874' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> </div> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1875' onclick='hideorshow("x1875","x1876")'>show</button></p> <div id='x1876' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1877' onclick='hideorshow("x1877","x1878")'>show</button></p> <div id='x1878' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </p><p>Note that there are paths through the syntax diagrams that are not allowed in practice. Some examples: </p><ul> <li>A <a href="lang_select.html#values">VALUES</a> clause can be the first element in a <a href="lang_select.html#compound">compound SELECT</a> that uses a <a href="lang_with.html">WITH</a> clause, but a <a href="lang_select.html#simpleselect">simple SELECT</a> that consists of just a <a href="lang_select.html#values">VALUES</a> clause cannot be preceded by a <a href="lang_with.html">WITH</a> clause. </li><li>The <a href="lang_with.html">WITH</a> clause must occur on the first SELECT of a <a href="lang_select.html#compound">compound SELECT</a>. It cannot follow a <a href="syntax/compound-operator.html">compound-operator</a>. </li></ul> <p>These and other similar syntax restrictions are described in the text. </p><p>The SELECT statement is the most complicated command in the SQL language. To make the description easier to follow, some of the passages below describe the way the data returned by a SELECT statement is determined as a series of steps. It is important to keep in mind that this is purely illustrative - in practice neither SQLite nor any other SQL engine is required to follow this or any other specific process. <a name="simpleselect"></a> </p><h1 id="simple_select_processing"><span>2. </span>Simple Select Processing</h1> <p>The core of a SELECT statement is a "simple SELECT" shown by the <a href="syntax/select-core.html">select-core</a> and <a href="syntax/simple-select-stmt.html">simple-select-stmt</a> syntax diagrams below. In practice, most SELECT statements are simple SELECT statements. <p><b><a href="syntax/simple-select-stmt.html">simple-select-stmt:</a></b> <button id='x1879' onclick='hideorshow("x1879","x1880")'>hide</button></p> <div id='x1880' class='imgcontainer'> <img alt="syntax diagram simple-select-stmt" src="images/syntax/simple-select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1881' onclick='hideorshow("x1881","x1882")'>show</button></p> <div id='x1882' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1883' onclick='hideorshow("x1883","x1884")'>show</button></p> <div id='x1884' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1885' onclick='hideorshow("x1885","x1886")'>show</button></p> <div id='x1886' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1887' onclick='hideorshow("x1887","x1888")'>show</button></p> <div id='x1888' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1889' onclick='hideorshow("x1889","x1890")'>show</button></p> <div id='x1890' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1891' onclick='hideorshow("x1891","x1892")'>show</button></p> <div id='x1892' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1893' onclick='hideorshow("x1893","x1894")'>show</button></p> <div id='x1894' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1895' onclick='hideorshow("x1895","x1896")'>show</button></p> |
182 183 184 185 186 187 188 | <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1899' onclick='hideorshow("x1899","x1900")'>show</button></p> <div id='x1900' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> | | < < < < < < < < < < < < < | | | | > | | > | < < < < | < | | | | | | | | < < < < < < < < < | | | | < < < < | | | | | | | | | | < < < < < | | | | < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < | 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 | <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1899' onclick='hideorshow("x1899","x1900")'>show</button></p> <div id='x1900' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1901' onclick='hideorshow("x1901","x1902")'>show</button></p> <div id='x1902' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1903' onclick='hideorshow("x1903","x1904")'>show</button></p> <div id='x1904' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1905' onclick='hideorshow("x1905","x1906")'>show</button></p> <div id='x1906' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1907' onclick='hideorshow("x1907","x1908")'>show</button></p> <div id='x1908' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1909' onclick='hideorshow("x1909","x1910")'>show</button></p> <div id='x1910' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1911' onclick='hideorshow("x1911","x1912")'>show</button></p> <div id='x1912' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1913' onclick='hideorshow("x1913","x1914")'>show</button></p> <div id='x1914' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1915' onclick='hideorshow("x1915","x1916")'>show</button></p> <div id='x1916' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1917' onclick='hideorshow("x1917","x1918")'>show</button></p> <div id='x1918' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1919' onclick='hideorshow("x1919","x1920")'>show</button></p> <div id='x1920' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1921' onclick='hideorshow("x1921","x1922")'>show</button></p> <div id='x1922' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1923' onclick='hideorshow("x1923","x1924")'>show</button></p> <div id='x1924' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1925' onclick='hideorshow("x1925","x1926")'>show</button></p> <div id='x1926' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1927' onclick='hideorshow("x1927","x1928")'>show</button></p> <div id='x1928' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1929' onclick='hideorshow("x1929","x1930")'>show</button></p> <div id='x1930' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x1931' onclick='hideorshow("x1931","x1932")'>show</button></p> <div id='x1932' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x1933' onclick='hideorshow("x1933","x1934")'>show</button></p> <div id='x1934' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x1935' onclick='hideorshow("x1935","x1936")'>show</button></p> <div id='x1936' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/select-core.html">select-core:</a></b> <button id='x1937' onclick='hideorshow("x1937","x1938")'>hide</button></p> <div id='x1938' class='imgcontainer'> <img alt="syntax diagram select-core" src="images/syntax/select-core.gif" /> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1939' onclick='hideorshow("x1939","x1940")'>show</button></p> <div id='x1940' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1941' onclick='hideorshow("x1941","x1942")'>show</button></p> <div id='x1942' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1943' onclick='hideorshow("x1943","x1944")'>show</button></p> <div id='x1944' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1945' onclick='hideorshow("x1945","x1946")'>show</button></p> <div id='x1946' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1947' onclick='hideorshow("x1947","x1948")'>show</button></p> <div id='x1948' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1949' onclick='hideorshow("x1949","x1950")'>show</button></p> <div id='x1950' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1951' onclick='hideorshow("x1951","x1952")'>show</button></p> <div id='x1952' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> </div> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1953' onclick='hideorshow("x1953","x1954")'>show</button></p> <div id='x1954' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1955' onclick='hideorshow("x1955","x1956")'>show</button></p> <div id='x1956' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </p><p>Generating the results of a simple SELECT statement is presented as a four step process in the description below: </p><ol> <li> <p><a href="lang_select.html#fromclause">FROM clause</a> processing: The input data for the simple SELECT is determined. The input data is either implicitly a single row with 0 columns (if there is no FROM clause) or is determined by the FROM clause. </p></li><li> <p><a href="lang_select.html#whereclause">WHERE clause</a> processing: The input data is filtered using the WHERE clause expression. </p></li><li> <p><a href="lang_select.html#resultset">GROUP BY, HAVING and result-column expression</a> processing: The set of result rows is computed by aggregating the data according to any GROUP BY clause and calculating the result-set expressions for the rows of the filtered input dataset. </p></li><li> <p><a href="lang_select.html#distinct">DISTINCT/ALL keyword</a> processing: If the query is a "SELECT DISTINCT" query, duplicate rows are removed from the set of result rows. </p></li></ol> <p>There are two types of simple SELECT statement - aggregate and non-aggregate queries. A simple SELECT statement is an aggregate query if it contains either a GROUP BY clause or one or more aggregate functions in the result-set. Otherwise, if a simple SELECT contains no aggregate functions or a GROUP BY clause, it is a non-aggregate query. </p><p><b>1. Determination of input data (FROM clause processing).</b> <a name="fromclause"></a> </p><p>The input data used by a simple SELECT query is a set of <i>N</i> rows each <i>M</i> columns wide. </p><p>If the FROM clause is omitted from a simple SELECT statement, then the input data is implicitly a single row zero columns wide (i.e. <i>N</i>=1 and <i>M</i>=0). </p><p>If a FROM clause is specified, the data on which a simple SELECT query operates comes from the one or more tables or subqueries (SELECT statements in parentheses) specified following the FROM keyword. A subquery specified in the <span class='yyterm'>table-or-subquery</span> following the FROM clause in a simple SELECT statement is handled as if it was a table containing the data returned by executing the subquery statement. Each column of the subquery has the <a href="datatype3.html#collation">collation sequence</a> and <a href="datatype3.html#affinity">affinity</a> of the corresponding expression in the subquery statement. </p><p>If there is only a single table or subquery in the FROM clause, then the input data used by the SELECT statement is the contents of the named table. If there is more than one table or subquery in FROM clause then the contents of all tables and/or subqueries are joined into a single dataset for the simple SELECT statement to operate on. Exactly how the data is combined depends on the specific <a href="syntax/join-operator.html">join-operator</a> and <a href="syntax/join-constraint.html">join-constraint</a> used to connect the tables or subqueries together. </p><p>All joins in SQLite are based on the cartesian product of the left and right-hand datasets. The columns of the cartesian product dataset are, in order, all the columns of the left-hand dataset followed by all the columns of the right-hand dataset. There is a row in the cartesian product dataset formed by combining each unique combination of a row from the left-hand and right-hand datasets. In other words, if the left-hand dataset consists of <i>N<sub><small>left</small></sub></i> rows of <i>M<sub><small>left</small></sub></i> columns, and the right-hand dataset of <i>N<sub><small>right</small></sub></i> rows of <i>M<sub><small>right</small></sub></i> columns, then the cartesian product is a dataset of <i>N<sub><small>left</small></sub>×N<sub><small>right</small></sub></i> rows, each containing <i>M<sub><small>left</small></sub>+M<sub><small>right</small></sub></i> columns. </p><p>If the join-operator is "CROSS JOIN", "INNER JOIN", "JOIN" or a comma (",") and there is no ON or USING clause, then the result of the join is simply the cartesian product of the left and right-hand datasets. If join-operator does have ON or USING clauses, those are handled according to the following bullet points: </p><ul> <li> <p>If there is an ON clause then the ON expression is evaluated for each row of the cartesian product as a <a href="lang_expr.html#booleanexpr">boolean expression</a>. Only rows for which the expression evaluates to true are included from the dataset. </p></li><li> <p>If there is a USING clause then each of the column names specified must exist in the datasets to both the left and right of the join-operator. For each pair of named columns, the expression "lhs.X = rhs.X" is evaluated for each row of the cartesian product as a <a href="lang_expr.html#booleanexpr">boolean expression</a>. Only rows for which all such expressions evaluates to true are included from the result set. When comparing values as a result of a USING clause, the normal rules for handling affinities, collation sequences and NULL values in comparisons apply. The column from the dataset on the left-hand side of the join-operator is considered to be on the left-hand side of the comparison operator (=) for the purposes of collation sequence and affinity precedence. </p><p>For each pair of columns identified by a USING clause, the column from the right-hand dataset is omitted from the joined dataset. This is the only difference between a USING clause and its equivalent ON constraint. </p></li><li> <p>If the NATURAL keyword is in the join-operator then an implicit USING clause is added to the join-constraints. The implicit USING clause contains each of the column names that appear in both the left and right-hand input datasets. If the left and right-hand input datasets feature no common column names, then the NATURAL keyword has no effect on the results of the join. A USING or ON clause may not be added to a join that specifies the NATURAL keyword. </p></li><li> <p>If the join-operator is a "LEFT JOIN" or "LEFT OUTER JOIN", then after the ON or USING filtering clauses have been applied, an extra row is added to the output for each row in the original left-hand input dataset that corresponds to no rows at all in the composite dataset (if any). The added rows contain NULL values in the columns that would normally contain values copied from the right-hand input dataset. </p></li></ul> <p>When more than two tables are joined together as part of a FROM clause, the join operations are processed in order from left to right. In other words, the FROM clause (A join-op-1 B join-op-2 C) is computed as ((A join-op-1 B) join-op-2 C). <a name="crossjoin"></a> </p><p><b>Side note: Special handling of CROSS JOIN.</b> There is no difference between the "INNER JOIN", "JOIN" and "," join operators. They are completely interchangeable in SQLite. The "CROSS JOIN" join operator produces the same result as the "INNER JOIN", "JOIN" and "," operators, but is <a href="optoverview.html#crossjoin">handled differently by the query optimizer</a> in that it prevents the query optimizer from reordering the tables in the join. An application programmer can use the CROSS JOIN operator to directly influence the algorithm that is chosen to implement the SELECT statement. Avoid using CROSS JOIN except in specific situations where manual control of the query optimizer is desired. Avoid using CROSS JOIN early in the development of an application as doing so is a <a href="http://c2.com/cgi/wiki?PrematureOptimization">premature optimization</a>. The special handling of CROSS JOIN is an SQLite-specific feature and is not a part of standard SQL. <a name="whereclause"></a> </p><p><b>2. WHERE clause filtering.</b> </p><p>If a WHERE clause is specified, the WHERE expression is evaluated for each row in the input data as a <a href="lang_expr.html#booleanexpr">boolean expression</a>. Only rows for which the WHERE clause expression evaluates to true are included from the dataset before continuing. Rows are excluded from the result if the WHERE clause evaluates to either false or NULL. </p><p>For a JOIN or INNER JOIN or CROSS JOIN, there is no difference between a constraint expression in the WHERE clause and one in the ON clause. However, for a LEFT JOIN or LEFT OUTER JOIN, the difference is very important. In a LEFT JOIN, the extra NULL row for the right-hand table is added after ON clause processing but before WHERE clause processing. A constraint of the form "left.x=right.y" in an ON clause will therefore allow through the added all-NULL rows of the right table. But if that same constraint is in the WHERE clause a NULL in "right.y" will prevent the expression "left.x=right.y" from being true, and thus exclude that row from the output. </p><p><b>3. Generation of the set of result rows.</b> <a name="resultset"></a> </p><p>Once the input data from the FROM clause has been filtered by the WHERE clause expression (if any), the set of result rows for the simple SELECT are calculated. Exactly how this is done depends on whether the simple SELECT is an aggregate or non-aggregate query, and whether or not a GROUP BY clause was specified. </p><p> The list of expressions between the SELECT and FROM keywords is known as the result expression list. If a result expression is the special expression "*" then all columns in the input data are substituted for that one expression. If the expression is the alias of a table or subquery in the FROM clause followed by ".*" then all columns from the named table or subquery are substituted for the single expression. It is an error to use a "*" or "alias.*" expression in any context other than a result expression list. It is also an error to use a "*" or "alias.*" expression in a simple SELECT query that does not have a FROM clause. </p><p> The number of columns in the rows returned by a simple SELECT statement is equal to the number of expressions in the result expression list after substitution of * and alias.* expressions. Each result row is calculated by evaluating the expressions in the result expression list with respect to a single row of input data or, for aggregate queries, with respect to a group of rows. </p><ul> <li><p>If the SELECT statement is <b>a non-aggregate query</b>, then each expression in the result expression list is evaluated for each row in the dataset filtered by the WHERE clause. </p></li><li><p>If the SELECT statement is <b>an aggregate query without a GROUP BY</b> clause, then each aggregate expression in the result-set is evaluated once across the entire dataset. Each non-aggregate expression in the result-set is evaluated once for an arbitrarily selected row of the dataset. The same arbitrarily selected row is used for each non-aggregate expression. Or, if the dataset contains zero rows, then each non-aggregate expression is evaluated against a row consisting entirely of NULL values. </p><p>The single row of result-set data created by evaluating the aggregate and non-aggregate expressions in the result-set forms the result of an aggregate query without a GROUP BY clause. An aggregate query without a GROUP BY clause always returns exactly one row of data, even if there are zero rows of input data. </p></li><li><p>If the SELECT statement is <b>an aggregate query with a GROUP BY</b> clause, then each of the expressions specified as part of the GROUP BY clause is evaluated for each row of the dataset. Each row is then assigned to a "group" based on the results; rows for which the results of evaluating the GROUP BY expressions are the same get assigned to the same group. For the purposes of grouping rows, NULL values are considered equal. The usual rules for <a href="datatype3.html#collation">selecting a collation sequence</a> with which to compare text values apply when evaluating expressions in a GROUP BY clause. The expressions in the GROUP BY clause do <em>not</em> have to be expressions that appear in the result. The expressions in a GROUP BY clause may not be aggregate expressions. </p><p>If a HAVING clause is specified, it is evaluated once for each group of rows as a <a href="lang_expr.html#booleanexpr">boolean expression</a>. If the result of evaluating the HAVING clause is false, the group is discarded. If the HAVING clause is an aggregate expression, it is evaluated across all rows in the group. If a HAVING clause is a non-aggregate expression, it is evaluated with respect to an arbitrarily selected row from the group. The HAVING expression may refer to values, even aggregate functions, that are not in the result.</p> <p>Each expression in the result-set is then evaluated once for each group of rows. If the expression is an aggregate expression, it is evaluated across all rows in the group. Otherwise, it is evaluated against a single arbitrarily chosen row from within the group. If there is more than one non-aggregate expression in the result-set, then all such expressions are evaluated for the same row. </p><p>Each group of input dataset rows contributes a single row to the set of result rows. Subject to filtering associated with the DISTINCT keyword, the number of rows returned by an aggregate query with a GROUP BY clause is the same as the number of groups of rows produced by applying the GROUP BY and HAVING clauses to the filtered input dataset. </p></li></ul> <a name="bareagg"></a> <p><b>Side note: Bare columns in an aggregate queries.</b> The usual case is that all column names in an aggregate query are either arguments to <a href="lang_aggfunc.html">aggregate functions</a> or else appear in the GROUP BY clause. A result column which contains a column name that is not within an aggregate function and that does not appear in the GROUP BY clause (if one exists) is called a "bare" column. Example: </p><blockquote><pre> SELECT a, b, sum(c) FROM tab1 GROUP BY a; </pre></blockquote> <p>In the query above, the "a" column is part of the GROUP BY clause and so each row of the output contains one of the distinct values for "a". The "c" column is contained within the <a href="lang_aggfunc.html#sumunc">sum()</a> aggregate function and so that output column is the sum of all "c" values in rows that have the same value for "a". But what is the result of the bare column "b"? The answer is that the "b" result will be the value for "b" in one of the input rows that form the aggregate. The problem is that you usually do not know which input row is used to compute "b", and so in many cases the value for "b" is undefined. </p> <p> Special processing occurs when the aggregate function is either <a href="lang_aggfunc.html#maxggunc">min()</a> or <a href="lang_aggfunc.html#minggunc">max()</a>. Example: </p><blockquote><pre> SELECT a, b, max(c) FROM tab1 GROUP BY a; </pre></blockquote> <p>When the <a href="lang_aggfunc.html#maxggunc">min()</a> or <a href="lang_aggfunc.html#minggunc">max()</a> aggregate functions are used in an aggregate query, all bare columns in the result set take values from the input row which also contains the minimum or maximum. So in the query above, the value of the "b" column in the output will be the value of the "b" column in the input row that has the largest "c" value. There is still an ambiguity if two or more of the input rows have the same minimum or maximum value or if the query contains more than one min() and/or max() aggregate function. Only the built-in <a href="lang_aggfunc.html#minggunc">min()</a> and <a href="lang_aggfunc.html#maxggunc">max()</a> functions work this way. </p> <p><b>4. Removal of duplicate rows (DISTINCT processing).</b> <a name="distinct"></a> </p><p>One of the ALL or DISTINCT keywords may follow the SELECT keyword in a simple SELECT statement. If the simple SELECT is a SELECT ALL, then the entire set of result rows are returned by the SELECT. If neither ALL or DISTINCT are present, then the behavior is as if ALL were specified. If the simple SELECT is a SELECT DISTINCT, then duplicate rows are removed from the set of result rows before it is returned. For the purposes of detecting duplicate rows, two NULL values are considered to be equal. The <a href="datatype3.html#colrules">usual rules</a> apply for selecting a collation sequence to compare text values. <a name="compound"></a> </p><h1 id="compound_select_statements"><span>3. </span>Compound Select Statements</h1> <p>Two or more <a href="lang_select.html#simpleselect">simple SELECT</a> statements may be connected together to form a compound SELECT using the UNION, UNION ALL, INTERSECT or EXCEPT operator, as shown by the following diagram: <p><b><a href="syntax/compound-select-stmt.html">compound-select-stmt:</a></b> <button id='x1957' onclick='hideorshow("x1957","x1958")'>hide</button></p> <div id='x1958' class='imgcontainer'> <img alt="syntax diagram compound-select-stmt" src="images/syntax/compound-select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x1959' onclick='hideorshow("x1959","x1960")'>show</button></p> <div id='x1960' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1961' onclick='hideorshow("x1961","x1962")'>show</button></p> <div id='x1962' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1963' onclick='hideorshow("x1963","x1964")'>show</button></p> <div id='x1964' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1965' onclick='hideorshow("x1965","x1966")'>show</button></p> <div id='x1966' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1967' onclick='hideorshow("x1967","x1968")'>show</button></p> <div id='x1968' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1969' onclick='hideorshow("x1969","x1970")'>show</button></p> <div id='x1970' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x1971' onclick='hideorshow("x1971","x1972")'>show</button></p> <div id='x1972' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x1973' onclick='hideorshow("x1973","x1974")'>show</button></p> <div id='x1974' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x1975' onclick='hideorshow("x1975","x1976")'>show</button></p> <div id='x1976' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1977' onclick='hideorshow("x1977","x1978")'>show</button></p> <div id='x1978' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x1979' onclick='hideorshow("x1979","x1980")'>show</button></p> <div id='x1980' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x1981' onclick='hideorshow("x1981","x1982")'>show</button></p> <div id='x1982' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x1983' onclick='hideorshow("x1983","x1984")'>show</button></p> <div id='x1984' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x1985' onclick='hideorshow("x1985","x1986")'>show</button></p> <div id='x1986' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x1987' onclick='hideorshow("x1987","x1988")'>show</button></p> <div id='x1988' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x1989' onclick='hideorshow("x1989","x1990")'>show</button></p> <div id='x1990' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x1991' onclick='hideorshow("x1991","x1992")'>show</button></p> <div id='x1992' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x1993' onclick='hideorshow("x1993","x1994")'>show</button></p> <div id='x1994' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x1995' onclick='hideorshow("x1995","x1996")'>show</button></p> <div id='x1996' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x1997' onclick='hideorshow("x1997","x1998")'>show</button></p> <div id='x1998' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x1999' onclick='hideorshow("x1999","x2000")'>show</button></p> <div id='x2000' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x2001' onclick='hideorshow("x2001","x2002")'>show</button></p> <div id='x2002' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x2003' onclick='hideorshow("x2003","x2004")'>show</button></p> <div id='x2004' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x2005' onclick='hideorshow("x2005","x2006")'>show</button></p> <div id='x2006' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2007' onclick='hideorshow("x2007","x2008")'>show</button></p> <div id='x2008' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x2009' onclick='hideorshow("x2009","x2010")'>show</button></p> <div id='x2010' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x2011' onclick='hideorshow("x2011","x2012")'>show</button></p> <div id='x2012' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x2013' onclick='hideorshow("x2013","x2014")'>show</button></p> <div id='x2014' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/select-core.html">select-core:</a></b> <button id='x2015' onclick='hideorshow("x2015","x2016")'>show</button></p> <div id='x2016' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-core" src="images/syntax/select-core.gif" /> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x2017' onclick='hideorshow("x2017","x2018")'>show</button></p> <div id='x2018' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x2019' onclick='hideorshow("x2019","x2020")'>show</button></p> <div id='x2020' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x2021' onclick='hideorshow("x2021","x2022")'>show</button></p> <div id='x2022' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x2023' onclick='hideorshow("x2023","x2024")'>show</button></p> <div id='x2024' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x2025' onclick='hideorshow("x2025","x2026")'>show</button></p> <div id='x2026' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x2027' onclick='hideorshow("x2027","x2028")'>show</button></p> <div id='x2028' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x2029' onclick='hideorshow("x2029","x2030")'>show</button></p> <div id='x2030' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> </div> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x2031' onclick='hideorshow("x2031","x2032")'>show</button></p> <div id='x2032' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2033' onclick='hideorshow("x2033","x2034")'>show</button></p> <div id='x2034' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </p><p>In a compound SELECT, all the constituent SELECTs must return the same number of result columns. As the components of a compound SELECT must be simple SELECT statements, they may not contain <a href="lang_select.html#orderby">ORDER BY</a> or <a href="lang_select.html#limitoffset">LIMIT</a> clauses. <a href="lang_select.html#orderby">ORDER BY</a> and <a href="lang_select.html#limitoffset">LIMIT</a> clauses may only occur at the end of the entire compound SELECT, and then only if the final element of the compound is not a <a href="lang_select.html#values">VALUES</a> clause. </p><p>A compound SELECT created using UNION ALL operator returns all the rows from the SELECT to the left of the UNION ALL operator, and all the rows from the SELECT to the right of it. The UNION operator works the same way as UNION ALL, except that duplicate rows are removed from the final result set. The INTERSECT operator returns the intersection of the results of the left and right SELECTs. The EXCEPT operator returns the subset of rows returned by the left SELECT that are not also returned by the right-hand SELECT. Duplicate rows are removed from the results of INTERSECT and EXCEPT operators before the result set is returned. </p><p>For the purposes of determining duplicate rows for the results of compound SELECT operators, NULL values are considered equal to other NULL values and distinct from all non-NULL values. The collation sequence used to compare two text values is determined as if the columns of the left and right-hand SELECT statements were the left and right-hand operands of the equals (=) operator, except that greater precedence is not assigned to a collation sequence specified with the postfix COLLATE operator. No affinity transformations are applied to any values when comparing rows as part of a compound SELECT. </p><p>When three or more simple SELECTs are connected into a compound SELECT, they group from left to right. In other words, if "A", "B" and "C" are all simple SELECT statements, (A op B op C) is processed as ((A op B) op C). </p> <a name="orderby"></a> <h1 id="the_order_by_clause"><span>4. </span>The ORDER BY clause</h1> <p>If a SELECT statement that returns more than one row does not have an ORDER BY clause, the order in which the rows are returned is undefined. Or, if a SELECT statement does have an ORDER BY clause, then the list of expressions attached to the ORDER BY determine the order in which rows are returned to the user. </p><p> In a <a href="lang_select.html#compound">compound SELECT</a> statement, only the last or right-most <a href="lang_select.html#simpleselect">simple SELECT</a> may have an ORDER BY clause. That ORDER BY clause will apply across all elements of the compound. If the right-most element of a <a href="lang_select.html#compound">compound SELECT</a> is a <a href="lang_select.html#values">VALUES</a> clause, then no ORDER BY clause is allowed on that statement. </p><p>Rows are first sorted based on the results of evaluating the left-most expression in the ORDER BY list, then ties are broken by evaluating the second left-most expression and so on. The order in which two rows for which all ORDER BY expressions evaluate to equal values are returned is undefined. Each ORDER BY expression may be optionally followed by one of the keywords ASC (smaller values are returned first) or DESC (larger values are returned first). If neither ASC or DESC are specified, rows are sorted in ascending (smaller values first) order by default. <a name="nullslast"></a> </p><p>SQLite considers NULL values to be smaller than any other values for sorting purposes. Hence, NULLs naturally appear at the beginning of an ASC order-by and at the end of a DESC order-by. This can be changed using the "ASC NULLS LAST" or "DESC NULLS FIRST" syntax. </p><p>Each ORDER BY expression is processed as follows:</p> <ol> <li><p>If the ORDER BY expression is a constant integer K then the expression is considered an alias for the K-th column of the result set (columns are numbered from left to right starting with 1). </p></li><li><p>If the ORDER BY expression is an identifier that corresponds to the alias of one of the output columns, then the expression is considered an alias for that column. </p></li><li><p>Otherwise, if the ORDER BY expression is any other expression, it is evaluated and the returned value used to order the output rows. If the SELECT statement is a simple SELECT, then an ORDER BY may contain any arbitrary expressions. However, if the SELECT is a compound SELECT, then ORDER BY expressions that are not aliases to output columns must be exactly the same as an expression used as an output column. </p></li></ol> <p>For the purposes of sorting rows, values are compared in the same way as for <a href="datatype3.html#comparisons">comparison expressions</a>. The collation sequence used to compare two text values is determined as follows: </p><ol> <li><p>If the ORDER BY expression is assigned a collation sequence using the postfix <a href="lang_expr.html#collateop">COLLATE operator</a>, then the specified collation sequence is used. </p></li><li><p>Otherwise, if the ORDER BY expression is an alias to an expression that has been assigned a collation sequence using the postfix <a href="lang_expr.html#collateop">COLLATE operator</a>, then the collation sequence assigned to the aliased expression is used. </p></li><li><p>Otherwise, if the ORDER BY expression is a column or an alias of an expression that is a column, then the default collation sequence for the column is used. </p></li><li><p>Otherwise, the <a href="datatype3.html#collation">BINARY</a> collation sequence is used. </p></li></ol> <p>In a <a href="lang_select.html#compound">compound SELECT</a> statement, all ORDER BY expressions are handled as aliases for one of the result columns of the compound. If an ORDER BY expression is not an integer alias, then SQLite searches the left-most SELECT in the compound for a result column that matches either the second or third rules above. If a match is found, the search stops and the expression is handled as an alias for the result column that it has been matched against. Otherwise, the next SELECT to the right is tried, and so on. If no matching expression can be found in the result columns of any constituent SELECT, it is an error. Each term of the ORDER BY clause is processed separately and may be matched against result columns from different SELECT statements in the compound.</p> <a name="limitoffset"></a> <h1 id="the_limit_clause"><span>5. </span>The LIMIT clause</h1> <p>The LIMIT clause is used to place an upper bound on the number of rows returned by the entire SELECT statement. </p><p>In a <a href="lang_select.html#compound">compound SELECT</a>, only the last or right-most <a href="lang_select.html#simpleselect">simple SELECT</a> may contain a LIMIT clause. In a <a href="lang_select.html#compound">compound SELECT</a>, the LIMIT clause applies to the entire compound, not just the final SELECT. If the right-most <a href="lang_select.html#simpleselect">simple SELECT</a> is a <a href="lang_select.html#values">VALUES clause</a> then no LIMIT clause is allowed. </p><p>Any scalar expression may be used in the LIMIT clause, so long as it evaluates to an integer or a value that can be losslessly converted to an integer. If the expression evaluates to a NULL value or any other value that cannot be losslessly converted to an integer, an error is returned. If the LIMIT expression evaluates to a negative value, then there is no upper bound on the number of rows returned. Otherwise, the SELECT returns the first N rows of its result set only, where N is the value that the LIMIT expression evaluates to. Or, if the SELECT statement would return less than N rows without a LIMIT clause, then the entire result set is returned. </p><p>The expression attached to the optional OFFSET clause that may follow a LIMIT clause must also evaluate to an integer, or a value that can be losslessly converted to an integer. If an expression has an OFFSET clause, then the first M rows are omitted from the result set returned by the SELECT statement and the next N rows are returned, where M and N are the values that the OFFSET and LIMIT clauses evaluate to, respectively. Or, if the SELECT would return less than M+N rows if it did not have a LIMIT clause, then the first M rows are skipped and the remaining rows (if any) are returned. If the OFFSET clause evaluates to a negative value, the results are the same as if it had evaluated to zero. </p><p>Instead of a separate OFFSET clause, the LIMIT clause may specify two scalar expressions separated by a comma. In this case, the first expression is used as the OFFSET expression and the second as the LIMIT expression. This is counter-intuitive, as when using the OFFSET clause the second of the two expressions is the OFFSET and the first the LIMIT. This reversal of the offset and limit is intentional - it maximizes compatibility with other SQL database systems. However, to avoid confusion, programmers are strongly encouraged to use the form of the LIMIT clause that uses the "OFFSET" keyword and avoid using a LIMIT clause with a comma-separated offset. <a name="values"></a> </p><h1 id="the_values_clause"><span>6. </span>The VALUES clause</h1> <p>The phrase "VALUES(<i>expr-list</i>)" means the same thing as "SELECT <i>expr-list</i>". The phrase "VALUES(<i>expr-list-1</i>),...,(<i>expr-list-N</i>)" means the same thing as "SELECT <i>expr-list-1</i> UNION ALL ... UNION ALL SELECT <i>expr-list-N</i>". Both forms are the same, except that the number of SELECT statements in a compound is limited by <a href="c3ref/c_limit_attached.html#sqlitelimitcompoundselect">SQLITE_LIMIT_COMPOUND_SELECT</a> whereas the number of rows in a VALUES clause has no arbitrary limit. </p><p>There are some restrictions on the use of a VALUES clause that are not shown on the syntax diagrams: </p><ul> <li><p> A VALUES clause cannot be followed by <a href="lang_select.html#orderby">ORDER BY</a>. </p></li><li><p> A VALUES clause cannot be followed by <a href="lang_select.html#limitoffset">LIMIT</a>. </p></li></ul> <h1 id="the_with_clause"><span>7. </span>The WITH Clause</h1> <p>SELECT statements may be optionally preceded by a single <a href="lang_with.html">WITH clause</a> that defines one or more <a href="lang_with.html">common table expressions</a> for use within the SELECT statement. <a name="tabfunc1"></a> </p><h1 id="table_valued_functions_in_the_from_clause"><span>8. </span>Table-valued Functions In The FROM Clause</h1> <p>A <a href="vtab.html">virtual table</a> that contains <a href="vtab.html#hiddencol">hidden columns</a> can be used like a <a href="vtab.html#tabfunc2">table-valued function</a> in the FROM clause. The arguments to the table-valued function become constraints on the HIDDEN columns of the virtual table. Additional information can be found in the <a href="vtab.html#tabfunc2">virtual table documentation</a>. </p> |
Changes to Doc/Extra/Core/lang_transaction.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>Transaction</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > | | | | | | | > > | 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 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> Transaction </div> </div> <h1 id="transaction_control_syntax"><span>1. </span>Transaction Control Syntax</h1> <p><b><a href="syntax/begin-stmt.html">begin-stmt:</a></b> <button id='x2035' onclick='hideorshow("x2035","x2036")'>hide</button></p> <div id='x2036' class='imgcontainer'> <img alt="syntax diagram begin-stmt" src="images/syntax/begin-stmt.gif" /> </div> <p><b><a href="syntax/commit-stmt.html">commit-stmt:</a></b> <button id='x2037' onclick='hideorshow("x2037","x2038")'>hide</button></p> <div id='x2038' class='imgcontainer'> <img alt="syntax diagram commit-stmt" src="images/syntax/commit-stmt.gif" /> </div> <p><b><a href="syntax/rollback-stmt.html">rollback-stmt:</a></b> <button id='x2039' onclick='hideorshow("x2039","x2040")'>hide</button></p> <div id='x2040' class='imgcontainer'> <img alt="syntax diagram rollback-stmt" src="images/syntax/rollback-stmt.gif" /> </div> <h1 id="transactions"><span>2. </span>Transactions</h1> <p> No reads or writes occur except within a transaction. Any command that accesses the database (basically, any SQL command, except a few <a href="pragma.html#syntax">PRAGMA</a> statements) will automatically start a transaction if one is not already in effect. Automatically started transactions |
139 140 141 142 143 144 145 | transactions. An attempt to invoke the BEGIN command within a transaction will fail with an error, regardless of whether the transaction was started by <a href="lang_savepoint.html">SAVEPOINT</a> or a prior BEGIN. The COMMIT command and the ROLLBACK command without the TO clause work the same on <a href="lang_savepoint.html">SAVEPOINT</a> transactions as they do with transactions started by BEGIN.</p> | | | | | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | transactions. An attempt to invoke the BEGIN command within a transaction will fail with an error, regardless of whether the transaction was started by <a href="lang_savepoint.html">SAVEPOINT</a> or a prior BEGIN. The COMMIT command and the ROLLBACK command without the TO clause work the same on <a href="lang_savepoint.html">SAVEPOINT</a> transactions as they do with transactions started by BEGIN.</p> <h2 id="read_transactions_versus_write_transactions"><span>2.1. </span>Read transactions versus write transactions</h2> <p>SQLite current supports multiple simultaneous read transactions coming from separate database connections, possibly in separate threads or processes, but only one simultaneous write transaction. </p><p> </p><p>A read transaction is used for reading only. A write transaction allows both reading and writing. A read transaction is started by a SELECT statement, and a write transaction is started by statements like CREATE, DELETE, DROP, INSERT, or UPDATE (collectively "write statements"). If a write statement occurs while a read transaction is active, then the read transaction is upgraded to write transaction if possible. If some other database connection has already modified the database or is already in the process of |
173 174 175 176 177 178 179 | transaction is active, X will continue to see an historic snapshot the database prior to the changes implemented by Y. </p> <a name="immediate"></a> | | | | 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 | transaction is active, X will continue to see an historic snapshot the database prior to the changes implemented by Y. </p> <a name="immediate"></a> <h2 id="deferred_immediate_and_exclusive_transactions"><span>2.2. </span>DEFERRED, IMMEDIATE, and EXCLUSIVE transactions</h2> <p> Transactions can be DEFERRED, IMMEDIATE, or EXCLUSIVE. The default transaction behavior is DEFERRED. </p> <p> DEFERRED means that the transaction does not actually start until the database is first accessed. Internally, the BEGIN DEFERRED statement merely sets a flag on the database connection that turns off the automatic commit that would normally occur when the last statement finishes. This causes the transaction that is automatically started to persist until an explicit COMMIT or ROLLBACK or until a rollback is provoked by an error or an ON CONFLICT ROLLBACK clause. If the first statement after BEGIN DEFERRED is a SELECT, then a read transaction is started. Subsequent write statements will upgrade the transaction to a |
211 212 213 214 215 216 217 | EXCLUSIVE is similar to IMMEDIATE in that a write transaction is started immediately. EXCLUSIVE and IMMEDIATE are the same in <a href="wal.html">WAL mode</a>, but in other journaling modes, EXCLUSIVE prevents other database connections from reading the database while the transaction is underway. </p> | | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | EXCLUSIVE is similar to IMMEDIATE in that a write transaction is started immediately. EXCLUSIVE and IMMEDIATE are the same in <a href="wal.html">WAL mode</a>, but in other journaling modes, EXCLUSIVE prevents other database connections from reading the database while the transaction is underway. </p> <h2 id="implicit_versus_explicit_transactions"><span>2.3. </span>Implicit versus explicit transactions</h2> <p> An implicit transaction (a transaction that is started automatically, not a transaction started by BEGIN) is committed automatically when the last active statement finishes. A statement finishes when its last cursor closes, which is guaranteed to happen when the prepared statement is <a href="c3ref/reset.html">reset</a> or |
261 262 263 264 265 266 267 | </p> <p> If <a href="pragma.html#pragma_journal_mode">PRAGMA journal_mode</a> is set to OFF (thus disabling the rollback journal file) then the behavior of the ROLLBACK command is undefined. </p> | | | | | | | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | </p> <p> If <a href="pragma.html#pragma_journal_mode">PRAGMA journal_mode</a> is set to OFF (thus disabling the rollback journal file) then the behavior of the ROLLBACK command is undefined. </p> <h1 id="response_to_errors_within_a_transaction"><span>3. </span>Response To Errors Within A Transaction</h1> <p> If certain kinds of errors occur within a transaction, the transaction may or may not be rolled back automatically. The errors that can cause an automatic rollback include:</p> <ul> <li> <a href="rescode.html#full">SQLITE_FULL</a>: database or disk full </li><li> <a href="rescode.html#ioerr">SQLITE_IOERR</a>: disk I/O error </li><li> <a href="rescode.html#busy">SQLITE_BUSY</a>: database in use by another process </li><li> <a href="rescode.html#nomem">SQLITE_NOMEM</a>: out or memory </li></ul> <p> For all of these errors, SQLite attempts to undo just the one statement it was working on and leave changes from prior statements within the same transaction intact and continue with the transaction. However, depending on the statement being evaluated and the point at which the error occurs, it might be necessary for SQLite to rollback and |
295 296 297 298 299 300 301 302 | error, but no harm is caused by this.</p> <p>Future versions of SQLite may extend the list of errors which might cause automatic transaction rollback. Future versions of SQLite might change the error response. In particular, we may choose to simplify the interface in future versions of SQLite by causing the errors above to force an unconditional rollback.</p> | < | 309 310 311 312 313 314 315 316 | error, but no harm is caused by this.</p> <p>Future versions of SQLite may extend the list of errors which might cause automatic transaction rollback. Future versions of SQLite might change the error response. In particular, we may choose to simplify the interface in future versions of SQLite by causing the errors above to force an unconditional rollback.</p> |
Changes to Doc/Extra/Core/lang_update.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>UPDATE</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | < | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> UPDATE </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#overview">1. Overview</a></div> <div class="fancy-toc1"><a href="#details">2. Details</a></div> <div class="fancy-toc2"><a href="#restrictions_on_update_statements_within_create_trigger">2.1. Restrictions on UPDATE Statements Within CREATE TRIGGER</a></div> <div class="fancy-toc2"><a href="#optional_limit_and_order_by_clauses">2.2. Optional LIMIT and ORDER BY Clauses</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/update-stmt.html">update-stmt:</a></b> <button id='x2041' onclick='hideorshow("x2041","x2042")'>hide</button></p> <div id='x2042' class='imgcontainer'> <img alt="syntax diagram update-stmt" src="images/syntax/update-stmt.gif" /> <p><b><a href="syntax/column-name-list.html">column-name-list:</a></b> <button id='x2043' onclick='hideorshow("x2043","x2044")'>show</button></p> <div id='x2044' style='display:none;' class='imgcontainer'> <img alt="syntax diagram column-name-list" src="images/syntax/column-name-list.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x2045' onclick='hideorshow("x2045","x2046")'>show</button></p> <div id='x2046' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x2047' onclick='hideorshow("x2047","x2048")'>show</button></p> <div id='x2048' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x2049' onclick='hideorshow("x2049","x2050")'>show</button></p> <div id='x2050' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x2051' onclick='hideorshow("x2051","x2052")'>show</button></p> <div id='x2052' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2053' onclick='hideorshow("x2053","x2054")'>show</button></p> <div id='x2054' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x2055' onclick='hideorshow("x2055","x2056")'>show</button></p> <div id='x2056' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x2057' onclick='hideorshow("x2057","x2058")'>show</button></p> <div id='x2058' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x2059' onclick='hideorshow("x2059","x2060")'>show</button></p> <div id='x2060' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x2061' onclick='hideorshow("x2061","x2062")'>show</button></p> <div id='x2062' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x2063' onclick='hideorshow("x2063","x2064")'>show</button></p> <div id='x2064' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x2065' onclick='hideorshow("x2065","x2066")'>show</button></p> <div id='x2066' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x2067' onclick='hideorshow("x2067","x2068")'>show</button></p> <div id='x2068' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x2069' onclick='hideorshow("x2069","x2070")'>show</button></p> <div id='x2070' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x2071' onclick='hideorshow("x2071","x2072")'>show</button></p> <div id='x2072' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x2073' onclick='hideorshow("x2073","x2074")'>show</button></p> <div id='x2074' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x2075' onclick='hideorshow("x2075","x2076")'>show</button></p> <div id='x2076' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x2077' onclick='hideorshow("x2077","x2078")'>show</button></p> <div id='x2078' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2079' onclick='hideorshow("x2079","x2080")'>show</button></p> <div id='x2080' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x2081' onclick='hideorshow("x2081","x2082")'>show</button></p> <div id='x2082' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x2083' onclick='hideorshow("x2083","x2084")'>show</button></p> <div id='x2084' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/qualified-table-name.html">qualified-table-name:</a></b> <button id='x2085' onclick='hideorshow("x2085","x2086")'>show</button></p> <div id='x2086' style='display:none;' class='imgcontainer'> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif" /> </div> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x2087' onclick='hideorshow("x2087","x2088")'>show</button></p> <div id='x2088' style='display:none;' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x2089' onclick='hideorshow("x2089","x2090")'>show</button></p> <div id='x2090' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x2091' onclick='hideorshow("x2091","x2092")'>show</button></p> <div id='x2092' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x2093' onclick='hideorshow("x2093","x2094")'>show</button></p> <div id='x2094' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x2095' onclick='hideorshow("x2095","x2096")'>show</button></p> <div id='x2096' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x2097' onclick='hideorshow("x2097","x2098")'>show</button></p> <div id='x2098' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x2099' onclick='hideorshow("x2099","x2100")'>show</button></p> <div id='x2100' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x2101' onclick='hideorshow("x2101","x2102")'>show</button></p> <div id='x2102' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x2103' onclick='hideorshow("x2103","x2104")'>show</button></p> <div id='x2104' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x2105' onclick='hideorshow("x2105","x2106")'>show</button></p> <div id='x2106' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x2107' onclick='hideorshow("x2107","x2108")'>show</button></p> <div id='x2108' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x2109' onclick='hideorshow("x2109","x2110")'>show</button></p> <div id='x2110' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2111' onclick='hideorshow("x2111","x2112")'>show</button></p> <div id='x2112' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> </div> <p>An UPDATE statement is used to modify a subset of the values stored in zero or more rows of the database table identified by the <a href="syntax/qualified-table-name.html">qualified-table-name</a> specified as part of the UPDATE statement. </p><h1 id="details"><span>2. </span>Details</h1> <p>If the UPDATE statement does not have a WHERE clause, all rows in the table are modified by the UPDATE. Otherwise, the UPDATE affects only those rows for which the WHERE clause <a href="lang_expr.html#booleanexpr">boolean expression is true</a>. It is not an error if the WHERE clause does not evaluate to true for any row in the table - this just means that the UPDATE statement affects zero rows. </p><p>The modifications made to each row affected by an UPDATE statement are determined by the list of assignments following the SET keyword. Each assignment specifies a <span class='yyterm'>column-name</span> to the left of the equals sign and a scalar expression to the right. For each affected row, the named columns are set to the values found by evaluating the corresponding scalar expressions. If a single column-name appears more than once in the list of assignment expressions, all but the rightmost occurrence is ignored. Columns that do not appear in the list of assignments are left unmodified. The scalar expressions may refer to columns of the row being updated. In this case all scalar expressions are evaluated before any assignments are made. </p><p>Beginning in SQLite <a href="releaselog/3_15_0.html">version 3.15.0</a> (2016-10-14), an assignment in the SET clause can be a <a href="syntax/column-name-list.html">parenthesized list of column names</a> on the left and a <a href="rowvalue.html">row value</a> of the same size on the right. </p><p>The optional "OR <i>action</i>" conflict clause that follows the UPDATE keyword allows the user to nominate a specific constraint conflict resolution algorithm to use during this one UPDATE command. Refer to the section entitled <a href="lang_conflict.html">ON CONFLICT</a> for additional information. </p><h2 id="restrictions_on_update_statements_within_create_trigger"><span>2.1. </span>Restrictions on UPDATE Statements Within CREATE TRIGGER</h2> <p>The following additional syntax restrictions apply to UPDATE statements that occur within the body of a <a href="lang_createtrigger.html">CREATE TRIGGER</a> statement. </p><ul> <li><p>The <span class='yyterm'>table-name</span> specified as part of an UPDATE statement within a trigger body must be unqualified. In other words, the <i>schema-name</i><b>.</b> prefix on the table name of the UPDATE is not allowed within triggers. Unless the table to which the trigger is attached is in the TEMP database, the table being updated by the trigger program must reside in the same database as it. If the table to which the trigger is attached is in the TEMP database, then the unqualified name of the table being updated is resolved in the same way as it is for a top-level statement (by searching first the TEMP database, then the main database, then any other databases in the order they were attached). </p></li><li><p>The INDEXED BY and NOT INDEXED clauses are not allowed on UPDATE statements within triggers.</p> </li><li><p>The LIMIT and ORDER BY clauses for UPDATE are unsupported within triggers, regardless of the compilation options used to build SQLite. </p></li></ul> <h2 id="optional_limit_and_order_by_clauses"><span>2.2. </span>Optional LIMIT and ORDER BY Clauses</h2> <p>If SQLite is built with the <a href="compile.html#enable_update_delete_limit">SQLITE_ENABLE_UPDATE_DELETE_LIMIT</a> compile-time option then the syntax of the UPDATE statement is extended with optional ORDER BY and LIMIT clauses as follows:</p> <p><b><a href="syntax/update-stmt-limited.html">update-stmt-limited:</a></b></p><div class='imgcontainer'> <img alt="syntax diagram update-stmt-limited" src="images/syntax/update-stmt-limited.gif"></img> </div> <p>If an UPDATE statement has a LIMIT clause, the maximum number of rows that will be updated is found by evaluating the accompanying expression and casting it to an integer value. A negative value is interpreted as "no limit". </p><p>If the LIMIT expression evaluates to non-negative value <i>N</i> and the UPDATE statement has an ORDER BY clause, then all rows that would be updated in the absence of the LIMIT clause are sorted according to the ORDER BY and the first <i>N</i> updated. If the UPDATE statement also has an OFFSET clause, then it is similarly evaluated and cast to an integer value. If the OFFSET expression evaluates to a non-negative value <i>M</i>, then the first <i>M</i> rows are skipped and the following <i>N</i> rows updated instead. </p><p>If the UPDATE statement has no ORDER BY clause, then all rows that would be updated in the absence of the LIMIT clause are assembled in an arbitrary order before applying the LIMIT and OFFSET clauses to determine which are actually updated. </p><p>The ORDER BY clause on an UPDATE statement is used only to determine which rows fall within the LIMIT. The order in which rows are modified is arbitrary and is not influenced by the ORDER BY clause. </p> |
Changes to Doc/Extra/Core/lang_vacuum.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>VACUUM</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > | | | > | | | | | | | | | | | | | | | | | | < < | 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 242 243 244 245 246 247 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> VACUUM </div> </div> <h1 id="syntax"><span>1. </span>Syntax</h1> <p><b><a href="syntax/vacuum-stmt.html">vacuum-stmt:</a></b> <button id='x2159' onclick='hideorshow("x2159","x2160")'>hide</button></p> <div id='x2160' class='imgcontainer'> <img alt="syntax diagram vacuum-stmt" src="images/syntax/vacuum-stmt.gif" /> </div> <h1 id="description"><span>2. </span>Description</h1> <p> The VACUUM command rebuilds the database file, repacking it into a minimal amount of disk space. There are several reasons an application might do this: </p><ul> <li> <p> Unless SQLite is running in "auto_vacuum=FULL" mode, when a large amount of data is deleted from the database file it leaves behind empty space, or "free" database pages. This means the database file might be larger than strictly necessary. Running VACUUM to rebuild the database reclaims this space and reduces the size of the database file. </p></li><li> <p> Frequent inserts, updates, and deletes can cause the database file to become fragmented - where data for a single table or index is scattered around the database file. Running VACUUM ensures that each table and index is largely stored contiguously within the database file. In some cases, VACUUM may also reduce the number of partially filled pages in the database, reducing the size of the database file further. </p></li><li> <p> When content is deleted from an SQLite database, the content is not usually erased but rather the space used to hold the content is marked as being available for reuse. This can allow deleted content to be recovered by a hacker or by forensic analysis. Running VACUUM will clean the database of all traces of deleted content, thus preventing an adversary from recovering deleted content. Using VACUUM in this way is an alternative to setting <a href="pragma.html#pragma_secure_delete">PRAGMA secure_delete=ON</a>. </p></li><li> <p> Normally, the database <a href="pragma.html#pragma_page_size">page_size</a> and whether or not the database supports <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> must be configured before the database file is actually created. However, when not in <a href="wal.html">write-ahead log</a> mode, the <a href="pragma.html#pragma_page_size">page_size</a> and/or <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> properties of an existing database may be changed by using the <a href="pragma.html#pragma_page_size">page_size</a> and/or <a href="pragma.html#pragma_auto_vacuum">pragma auto_vacuum</a> pragmas and then immediately VACUUMing the database. When in <a href="wal.html">write-ahead log</a> mode, only the <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> support property can be changed using VACUUM. </p></li></ul> <p>By default, VACUUM only works only on the main database. <a href="lang_attach.html">Attached databases</a> can be vacuumed by appending the appropriate <span class='yyterm'>schema-name</span> to the VACUUM statement. </p><p><b>Compatibility Warning:</b> The ability to vacuum attached databases was added in <a href="releaselog/3_15_0.html">version 3.15.0</a> (2016-10-14). Prior to that, a <span class='yyterm'>schema-name</span> added to the VACUUM statement would be silently ignored and the "main" schema would be vacuumed.</p> <a name="vacuuminto"></a> <h2 id="vacuum_with_an_into_clause"><span>2.1. </span>VACUUM with an INTO clause</h2> <p>If the INTO clause is included, then the original database file is unchanged and a new database is created in the filename given by the argument to the INTO clause. The new database will contain the same logical content as the original database, fully vacuumed. </p><p> The VACUUM command with an INTO clause is an alternative to the <a href="backup.html">backup API</a> for generating backup copies of a live database. The advantage of using VACUUM INTO is that the resulting backup database is minimal in size and hence the amount of filesystem I/O may be reduced. Also, all deleted content is purged from the backup, leaving behind no forensic traces. On the other hand, the <a href="backup.html">backup API</a> uses fewer CPU cycles and can be executed incrementally. </p><p> The filename in the INTO clause can be an arbitrary SQL expression that evaluates to a string. The file named by the INTO clause must not previously exist, or else it must be an empty file, or the VACUUM INTO command will fail with an error. </p><p> The argument to INTO can be a <a href="uri.html">URI filename</a> if URI filenames are enabled. URL filenames are enabled if any of the following are true: </p><ul> <li> The SQLite library was compiled with <a href="compile.html#use_uri">-DSQLITE_USE_URI=1</a>. </li><li> The <a href="c3ref/config.html">sqlite3_config</a>(<a href="c3ref/c_config_covering_index_scan.html#sqliteconfiguri">SQLITE_CONFIG_URI</a>,1) interfaces was invoked at start-time. </li><li> The <a href="c3ref/sqlite3.html">database connection</a> that is running the VACUUM INTO statement was originally opened using the <a href="c3ref/c_open_autoproxy.html">SQLITE_OPEN_URI</a> flag. </li></ul> <p> The VACUUM INTO command is transactional in the sense that the generated output database is a consistent snapshot of the original database. However, if the VACUUM INTO command is interrupted by an unplanned shutdown or power lose, then the generated output database might be incomplete and corrupt. Also, SQLite does not invoke fsync() or FlushFileBuffers() on the generated database to ensure that it has reached non-volatile storage before completing. <a name="howvacuumworks"></a> </p><h1 id="how_vacuum_works"><span>3. </span>How VACUUM works</h1> <p>The VACUUM command works by copying the contents of the database into a temporary database file and then overwriting the original with the contents of the temporary file. When overwriting the original, a rollback journal or <a href="wal.html">write-ahead log</a> WAL file is used just as it would be for any other database transaction. This means that when VACUUMing a database, as much as twice the size of the original database file is required in free disk space. </p><p>The VACUUM INTO command works the same way except that it uses the file named on the INTO clause in place of the temporary database and omits the step of copying the vacuumed database back over top of the original database. </p><p>The VACUUM command may change the <a href="lang_createtable.html#rowid">ROWIDs</a> of entries in any tables that do not have an explicit <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>. </p> <p>A VACUUM will fail if there is an open transaction on the database connection that is attempting to run the VACUUM. Unfinalized SQL statements typically hold a read transaction open, so the VACUUM might fail if there are unfinalized SQL statements on the same connection. VACUUM (but not VACUUM INTO) is a write operation and so if another database connection is holding a lock that prevents writes, then the VACUUM will fail. </p><p>An alternative to using the VACUUM command to reclaim space after data has been deleted is auto-vacuum mode, enabled using the <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> pragma. When <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> is enabled for a database free pages may be reclaimed after deleting data, causing the file to shrink, without rebuilding the entire database using VACUUM. However, using <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> can lead to extra database file fragmentation. And <a href="pragma.html#pragma_auto_vacuum">auto_vacuum</a> does not compact partially filled pages of the database as VACUUM does. </p> |
Changes to Doc/Extra/Core/lang_with.html.
1 2 3 4 5 | <!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"> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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>The WITH Clause</title> <!-- path= --> </head> <body> <div class=nosearch> <a href="index.html"> <img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> </a> |
69 70 71 72 73 74 75 | }, 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. */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | | | | 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 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 | }, 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; } </script> </div> <div class=fancy> <div class=nosearch> <div class="fancy_title"> The WITH Clause </div> <div class="fancy_toc"> <a onclick="toggle_toc()"> <span class="fancy_toc_mark" id="toc_mk">►</span> Table Of Contents </a> <div id="toc_sub"><div class="fancy-toc1"><a href="#overview">1. Overview</a></div> <div class="fancy-toc1"><a href="#ordinary_common_table_expressions">2. Ordinary Common Table Expressions</a></div> <div class="fancy-toc1"><a href="#recursive_common_table_expressions">3. Recursive Common Table Expressions</a></div> <div class="fancy-toc2"><a href="#recursive_query_examples">3.1. Recursive Query Examples</a></div> <div class="fancy-toc2"><a href="#hierarchical_query_examples">3.2. Hierarchical Query Examples</a></div> <div class="fancy-toc2"><a href="#queries_against_a_graph">3.3. Queries Against A Graph</a></div> <div class="fancy-toc2"><a href="#controlling_depth_first_versus_breadth_first_search_of_a_tree_using_order_by">3.4. Controlling Depth-First Versus Breadth-First Search Of a Tree Using ORDER BY</a></div> <div class="fancy-toc2"><a href="#outlandish_recursive_query_examples">3.5. Outlandish Recursive Query Examples</a></div> <div class="fancy-toc1"><a href="#limitations_and_caveats">4. Limitations And Caveats</a></div> </div> </div> <script> function toggle_toc(){ var sub = document.getElementById("toc_sub") var mk = document.getElementById("toc_mk") if( sub.style.display!="block" ){ sub.style.display = "block"; mk.innerHTML = "▼"; } else { sub.style.display = "none"; mk.innerHTML = "►"; } } </script> </div> <h1 id="overview"><span>1. </span>Overview</h1> <p><b><a href="syntax/with-clause.html">with-clause:</a></b> <button id='x2161' onclick='hideorshow("x2161","x2162")'>hide</button></p> <div id='x2162' class='imgcontainer'> <img alt="syntax diagram with-clause" src="images/syntax/with-clause.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x2163' onclick='hideorshow("x2163","x2164")'>show</button></p> <div id='x2164' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> <p><b><a href="syntax/select-stmt.html">select-stmt:</a></b> <button id='x2165' onclick='hideorshow("x2165","x2166")'>show</button></p> <div id='x2166' style='display:none;' class='imgcontainer'> <img alt="syntax diagram select-stmt" src="images/syntax/select-stmt.gif" /> <p><b><a href="syntax/common-table-expression.html">common-table-expression:</a></b> <button id='x2167' onclick='hideorshow("x2167","x2168")'>show</button></p> <div id='x2168' style='display:none;' class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="images/syntax/common-table-expression.gif" /> </div> <p><b><a href="syntax/compound-operator.html">compound-operator:</a></b> <button id='x2169' onclick='hideorshow("x2169","x2170")'>show</button></p> <div id='x2170' style='display:none;' class='imgcontainer'> <img alt="syntax diagram compound-operator" src="images/syntax/compound-operator.gif" /> </div> <p><b><a href="syntax/expr.html">expr:</a></b> <button id='x2171' onclick='hideorshow("x2171","x2172")'>show</button></p> <div id='x2172' style='display:none;' class='imgcontainer'> <img alt="syntax diagram expr" src="images/syntax/expr.gif" /> <p><b><a href="syntax/filter-clause.html">filter-clause:</a></b> <button id='x2173' onclick='hideorshow("x2173","x2174")'>show</button></p> <div id='x2174' style='display:none;' class='imgcontainer'> <img alt="syntax diagram filter-clause" src="images/syntax/filter-clause.gif" /> </div> <p><b><a href="syntax/literal-value.html">literal-value:</a></b> <button id='x2175' onclick='hideorshow("x2175","x2176")'>show</button></p> <div id='x2176' style='display:none;' class='imgcontainer'> <img alt="syntax diagram literal-value" src="images/syntax/literal-value.gif" /> </div> <p><b><a href="syntax/over-clause.html">over-clause:</a></b> <button id='x2177' onclick='hideorshow("x2177","x2178")'>show</button></p> <div id='x2178' style='display:none;' class='imgcontainer'> <img alt="syntax diagram over-clause" src="images/syntax/over-clause.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2179' onclick='hideorshow("x2179","x2180")'>show</button></p> <div id='x2180' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> <p><b><a href="syntax/raise-function.html">raise-function:</a></b> <button id='x2181' onclick='hideorshow("x2181","x2182")'>show</button></p> <div id='x2182' style='display:none;' class='imgcontainer'> <img alt="syntax diagram raise-function" src="images/syntax/raise-function.gif" /> </div> <p><b><a href="syntax/type-name.html">type-name:</a></b> <button id='x2183' onclick='hideorshow("x2183","x2184")'>show</button></p> <div id='x2184' style='display:none;' class='imgcontainer'> <img alt="syntax diagram type-name" src="images/syntax/type-name.gif" /> <p><b><a href="syntax/signed-number.html">signed-number:</a></b> <button id='x2185' onclick='hideorshow("x2185","x2186")'>show</button></p> <div id='x2186' style='display:none;' class='imgcontainer'> <img alt="syntax diagram signed-number" src="images/syntax/signed-number.gif" /> </div> </div> </div> <p><b><a href="syntax/join-clause.html">join-clause:</a></b> <button id='x2187' onclick='hideorshow("x2187","x2188")'>show</button></p> <div id='x2188' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-clause" src="images/syntax/join-clause.gif" /> <p><b><a href="syntax/join-constraint.html">join-constraint:</a></b> <button id='x2189' onclick='hideorshow("x2189","x2190")'>show</button></p> <div id='x2190' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-constraint" src="images/syntax/join-constraint.gif" /> </div> <p><b><a href="syntax/join-operator.html">join-operator:</a></b> <button id='x2191' onclick='hideorshow("x2191","x2192")'>show</button></p> <div id='x2192' style='display:none;' class='imgcontainer'> <img alt="syntax diagram join-operator" src="images/syntax/join-operator.gif" /> </div> </div> <p><b><a href="syntax/ordering-term.html">ordering-term:</a></b> <button id='x2193' onclick='hideorshow("x2193","x2194")'>show</button></p> <div id='x2194' style='display:none;' class='imgcontainer'> <img alt="syntax diagram ordering-term" src="images/syntax/ordering-term.gif" /> </div> <p><b><a href="syntax/result-column.html">result-column:</a></b> <button id='x2195' onclick='hideorshow("x2195","x2196")'>show</button></p> <div id='x2196' style='display:none;' class='imgcontainer'> <img alt="syntax diagram result-column" src="images/syntax/result-column.gif" /> </div> <p><b><a href="syntax/table-or-subquery.html">table-or-subquery:</a></b> <button id='x2197' onclick='hideorshow("x2197","x2198")'>show</button></p> <div id='x2198' style='display:none;' class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="images/syntax/table-or-subquery.gif" /> </div> <p><b><a href="syntax/window-defn.html">window-defn:</a></b> <button id='x2199' onclick='hideorshow("x2199","x2200")'>show</button></p> <div id='x2200' style='display:none;' class='imgcontainer'> <img alt="syntax diagram window-defn" src="images/syntax/window-defn.gif" /> <p><b><a href="syntax/frame-spec.html">frame-spec:</a></b> <button id='x2201' onclick='hideorshow("x2201","x2202")'>show</button></p> <div id='x2202' style='display:none;' class='imgcontainer'> <img alt="syntax diagram frame-spec" src="images/syntax/frame-spec.gif" /> </div> </div> </div> </div> <p>Common Table Expressions or CTEs act like temporary <a href="lang_createview.html">views</a> that exist only for the duration of a single SQL statement. There are two kinds of common table expressions: "ordinary" and "recursive". Ordinary common table expressions are helpful for making queries easier to understand by factoring subqueries out of the main SQL statement. Recursive common table expressions provide the ability to do hierarchical or recursive queries of trees and graphs, a capability that is not otherwise available in the SQL language. </p><p>All common table expressions (ordinary and recursive) are created by prepending a WITH clause in front of a <a href="lang_select.html">SELECT</a>, <a href="lang_insert.html">INSERT</a>, <a href="lang_delete.html">DELETE</a>, or <a href="lang_update.html">UPDATE</a> statement. A single WITH clause can specify one or more common table expressions, some of which are ordinary and some of which are recursive. <a name="ordinarycte"></a> </p><h1 id="ordinary_common_table_expressions"><span>2. </span>Ordinary Common Table Expressions</h1> <p>An ordinary common table expression works as if it were a <a href="lang_createview.html">view</a> that exists for the duration of a single statement. Ordinary common table expressions are useful for factoring out subqueries and making the overall SQL statement easier to read and understand. </p><p>A WITH clause can contain ordinary common table expressions even if it includes the RECURSIVE keyword. The use of RECURSIVE does not force common table expressions to be recursive. <a name="recursivecte"></a> </p><h1 id="recursive_common_table_expressions"><span>3. </span>Recursive Common Table Expressions</h1> <p>A recursive common table expression can be used to write a query that walks a tree or graph. A recursive common table expression has the same basic syntax as an ordinary common table expression, but with the following additional features: </p><ol> <li> The "<a href="syntax/select-stmt.html">select-stmt</a>" must be a <a href="lang_select.html#compound">compound select</a> where the right-most <a href="syntax/compound-operator.html">compound-operator</a> is either UNION or UNION ALL. </li><li> The table named on the left-hand side of the AS keyword must appear exactly once in the FROM clause of the right-most SELECT statement of the compound select, and nowhere else. </li><li> The right-most SELECT of the compound select must not make use of <a href="lang_aggfunc.html">aggregate</a> or <a href="windowfunctions.html">window functions</a>. </li></ol> <p>To put it another way, a recursive common table expression must look like the following: <p><b><a href="syntax/recursive-cte.html">recursive-cte:</a></b> <button id='x2203' onclick='hideorshow("x2203","x2204")'>hide</button></p> <div id='x2204' class='imgcontainer'> <img alt="syntax diagram recursive-cte" src="images/syntax/recursive-cte.gif" /> <p><b><a href="syntax/cte-table-name.html">cte-table-name:</a></b> <button id='x2205' onclick='hideorshow("x2205","x2206")'>show</button></p> <div id='x2206' style='display:none;' class='imgcontainer'> <img alt="syntax diagram cte-table-name" src="images/syntax/cte-table-name.gif" /> </div> </div> </p><p>Call the table named by the <a href="syntax/cte-table-name.html">cte-table-name</a> in a recursive common table expression the "recursive table". In the <a href="syntax/recursive-cte.html">recursive-cte</a> bubble diagram above, the recursive table must appear exactly once in the FROM clause of the <span class='yyterm'>recursive-select</span> and must not appear anywhere else in either the <span class='yyterm'>initial-select</span> or the <span class='yyterm'>recursive-select</span>, including subqueries. The <span class='yyterm'>initial-select</span> may be a <a href="lang_select.html#compound">compound select</a>, but it may not include an ORDER BY, LIMIT, or OFFSET. The recursive-select must be a simple select, not a compound. The recursive-select is allowed to include an ORDER BY, LIMIT, and/or OFFSET. </p><p>The basic algorithm for computing the content of the recursive table is as follows: </p><ol> <li> Run the <span class='yyterm'>initial-select</span> and add the results to a queue. </li><li> While the queue is not empty: <ol type="a"> <li> Extract a single row from the queue. </li><li> Insert that single row into the recursive table </li><li> Pretend that the single row just extracted is the only row in the recursive table and run the recursive-select, adding all results to the queue. </li></ol> </li></ol> <p>The basic procedure above may modified by the following additional rules: </p><ul> <li><p> If a UNION operator connects the <span class='yyterm'>initial-select</span> with the <span class='yyterm'>recursive-select</span>, then only add rows to the queue if no identical row has been previously added to the queue. Repeated rows are discarded before being added to the queue even if the repeated rows have already been extracted from the queue by the recursion step. If the operator is UNION ALL, then all rows generated by both the <span class='yyterm'>initial-select</span> and the <span class='yyterm'>recursive-select</span> are always added to the queue even if they are repeats. When determining if a row is repeated, NULL values compare equal to one another and not equal to any other value. </p></li><li><p> The LIMIT clause, if present, determines the maximum number of rows that will ever be added to the recursive table in step 2b. Once the limit is reached, the recursion stops. A limit of zero means that no rows are ever added to the recursive table, and a negative limit means an unlimited number of rows may be added to the recursive table. </p></li><li><p> The OFFSET clause, if it is present and has a positive value N, prevents the first N rows from being added to the recursive table. The first N rows are still processed by the <span class='yyterm'>recursive-select</span> — they just are not added to the recursive table. Rows are not counted toward fulfilling the LIMIT until all OFFSET rows have been skipped. </p></li><li><p> If an ORDER BY clause is present, it determines the order in which rows are extracted from the queue in step 2a. If there is no ORDER BY clause, then the order in which rows are extracted is undefined. (In the current implementation, the queue becomes a FIFO if the ORDER BY clause is omitted, but applications should not depend on that fact since it might change.) </p></li></ul> <a name="rcex1"></a> <h2 id="recursive_query_examples"><span>3.1. </span>Recursive Query Examples</h2> <p>The following query returns all integers between 1 and 1000000: </p><blockquote><pre> WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<1000000) SELECT="1" x="1" FROM="1" cnt;="1" </pre="1"></1000000)></pre></blockquote> <p>Consider how this query works. The initial-select runs first and returns a single row with a single column "1". This one row is added to the queue. In step 2a, that one row is extracted from the queue and added to "cnt". Then the recursive-select is run in accordance with step 2c generating a single new row with value "2" to add to the queue. The queue still has one row, so step 2 repeats. The "2" row is extracted and added to the recursive table by steps 2a and 2b. Then the row containing 2 is used as if it were the complete content of the recursive table and the recursive-select is run again, resulting in a row with value "3" being added to the queue. This repeats 999999 times until finally at step 2a the only value on the queue is a row containing 1000000. That row is extracted and added to the recursive table. But this time, the WHERE clause causes the recursive-select to return no rows, so the queue remains empty and the recursion stops. </p><p><b>Optimization note:</b> In the discussion above, statements like "insert the row into the recursive table" should be understood conceptually, not literally. It sounds as if SQLite is accumulating a huge table containing one million rows, then going back and scanning that table from top to bottom to generate the result. What really happens is that the query optimizer sees that values in the "cnt" recursive table are only used once. So as each row is added to the recursive table, that row is immediately returned as a result of the main SELECT statement and then discarded. SQLite does <em>not</em> accumulate a temporary table containing a million rows. Very little memory is needed to run the above example. However, if the example had used UNION instead of UNION ALL, then SQLite would have had to keep around all previously generated content in order to check for duplicates. For this reason, programmers should strive to use UNION ALL instead of UNION when feasible. </p><p>Here is a variation on the previous example: </p><blockquote><pre> WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 1000000 ) |
398 399 400 401 402 403 404 | queue to drain and the recursion to terminate. But the LIMIT clause will always stop the recursion. So it is good practice to always include a LIMIT clause as a safety if an upper bound on the size of the recursion is known. <a name="rcex2"></a> | | | | | | | | | | | | 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 | queue to drain and the recursion to terminate. But the LIMIT clause will always stop the recursion. So it is good practice to always include a LIMIT clause as a safety if an upper bound on the size of the recursion is known. <a name="rcex2"></a> </p><h2 id="hierarchical_query_examples"><span>3.2. </span>Hierarchical Query Examples</h2> <p>Consider a table that describes the members of an organization as well as the chain-of-command within that organization: </p><blockquote><pre> CREATE TABLE org( name TEXT PRIMARY KEY, boss TEXT REFERENCES org, height INT, -- other content omitted ); </pre></blockquote> <p>Every member in the organization has a name, and most members have a single boss. (The head of the whole organization has a NULL "boss" field.) The rows of the "org" table form a tree. </p><p>Here is a query that computes the average height over everyone in Alice's organization, including Alice: </p><blockquote><pre> WITH RECURSIVE works_for_alice(n) AS ( VALUES('Alice') UNION SELECT name FROM org, works_for_alice WHERE org.boss=works_for_alice.n ) SELECT avg(height) FROM org WHERE org.name IN works_for_alice; </pre></blockquote> <p>The next example uses two common table expressions in a single WITH clause. The following table records a family tree: </p><blockquote><pre> CREATE TABLE family( name TEXT PRIMARY KEY, mom TEXT REFERENCES family, dad TEXT REFERENCES family, born DATETIME, died DATETIME, -- NULL if still alive -- other content ); </pre></blockquote> <p>The "family" table is similar to the earlier "org" table except that now there are two parents to each member. We want to know all living ancestors of Alice, from oldest to youngest. An ordinary common table expression, "parent_of", is defined first. That ordinary CTE is a view that can be used to find all parents of any individual. That ordinary CTE is then used in the "ancestor_of_alice" recursive CTE. The recursive CTE is then used in the final query: </p><blockquote><pre> WITH RECURSIVE parent_of(name, parent) AS (SELECT name, mom FROM family UNION SELECT name, dad FROM family), ancestor_of_alice(name) AS (SELECT parent FROM parent_of WHERE name='Alice' UNION ALL SELECT parent FROM parent_of JOIN ancestor_of_alice USING(name)) SELECT family.name FROM ancestor_of_alice, family WHERE ancestor_of_alice.name=family.name AND died IS NULL ORDER BY born; </pre></blockquote> <a name="rcex3"></a> <h2 id="queries_against_a_graph"><span>3.3. </span>Queries Against A Graph</h2> <p>A version control system (VCS) will typically store the evolving versions of a project as a directed acyclic graph (DAG). Call each version of the project a "checkin". A single checkin can have zero or more parents. Most checkins (except the first) have a single parent, but in the case of a merge, a checkin might have two or three or more parents. A schema to keep track of checkins and the order in which they occur might look something like this: </p><blockquote><pre> CREATE TABLE checkin( id INTEGER PRIMARY KEY, mtime INTEGER -- timestamp when this checkin occurred ); CREATE TABLE derivedfrom( xfrom INTEGER NOT NULL REFERENCES checkin, -- parent checkin xto INTEGER NOT NULL REFERENCES checkin, -- derived checkin PRIMARY KEY(xfrom,xto) ); CREATE INDEX derivedfrom_back ON derivedfrom(xto,xfrom); </pre></blockquote> <p>This graph is acyclic. And we assume that the mtime of every child checkin is no less than the mtime of all its parents. But unlike the earlier examples, this graph might have multiple paths of differing lengths between any two checkins. </p><p>We want to know the twenty most recent ancestors in time (out of the thousands and thousands of ancestors in the whole DAG) for checkin "@BASELINE". (A query similar to this is used by the <a href="http://www.fossil-scm.org/">Fossil</a> VCS to show the N most recent ancestors of a check. For example: <a href="http://www.sqlite.org/src/timeline?p=trunk&n=30">http://www.sqlite.org/src/timeline?p=trunk&n=30</a>.) </p><blockquote><pre> WITH RECURSIVE ancestor(id,mtime) AS ( SELECT id, mtime FROM checkin WHERE id=@BASELINE UNION SELECT derivedfrom.xfrom, checkin.mtime FROM ancestor, derivedfrom, checkin WHERE ancestor.id=derivedfrom.xto |
536 537 538 539 540 541 542 | The ORDER BY essentially sets up a priority queue that forces the recursive query to look at the most recent ancestors first, allowing the use of a LIMIT clause to restrict the scope of the query to just the checkins of interest. <a name="withorderby"></a> | | | | | | | | | | | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 | The ORDER BY essentially sets up a priority queue that forces the recursive query to look at the most recent ancestors first, allowing the use of a LIMIT clause to restrict the scope of the query to just the checkins of interest. <a name="withorderby"></a> </p><h2 id="controlling_depth_first_versus_breadth_first_search_of_a_tree_using_order_by"><span>3.4. </span>Controlling Depth-First Versus Breadth-First Search Of a Tree Using ORDER BY</h2> <p>An ORDER BY clause on the recursive-select can be used to control whether the search of a tree is depth-first or breadth-first. To illustrate, we will use a variation on the "org" table from an example above, without the "height" column, and with some real data inserted: </p><blockquote><pre> CREATE TABLE org( name TEXT PRIMARY KEY, boss TEXT REFERENCES org ) WITHOUT ROWID; INSERT INTO org VALUES('Alice',NULL); INSERT INTO org VALUES('Bob','Alice'); INSERT INTO org VALUES('Cindy','Alice'); INSERT INTO org VALUES('Dave','Bob'); INSERT INTO org VALUES('Emma','Bob'); INSERT INTO org VALUES('Fred','Cindy'); INSERT INTO org VALUES('Gail','Cindy'); </pre></blockquote> <p>Here is a query to show the tree structure in a breadth-first pattern: </p><blockquote><pre> WITH RECURSIVE under_alice(name,level) AS ( VALUES('Alice',0) UNION ALL SELECT org.name, under_alice.level+1 FROM org JOIN under_alice ON org.boss=under_alice.name ORDER BY 2 ) SELECT substr('..........',1,level*3) || name FROM under_alice; </pre></blockquote> <p>The "ORDER BY 2" (which means the same as "ORDER BY under_alice.level+1") causes higher levels in the organization chart (with smaller "level" values) to be processed first, resulting in a breadth-first search. The output is: </p><blockquote><pre> Alice ...Bob ...Cindy ......Dave ......Emma ......Fred ......Gail </pre></blockquote> <p>But if we change the ORDER BY clause to add the "DESC" modifier, that will cause lower levels in the organization (with larger "level" values) to be processed first by the recursive-select, resulting in a depth-first search: </p><blockquote><pre> WITH RECURSIVE under_alice(name,level) AS ( VALUES('Alice',0) UNION ALL SELECT org.name, under_alice.level+1 FROM org JOIN under_alice ON org.boss=under_alice.name ORDER BY 2 <b>DESC</b> ) SELECT substr('..........',1,level*3) || name FROM under_alice; </pre></blockquote> <p>The output of this revised query is: </p><blockquote><pre> Alice ...Bob ......Dave ......Emma ...Cindy ......Fred ......Gail </pre></blockquote> <p>When the ORDER BY clause is omitted from the recursive-select, the queue behaves as a FIFO, which results in a breadth-first search. <a name="mandelbrot"></a> </p><h2 id="outlandish_recursive_query_examples"><span>3.5. </span>Outlandish Recursive Query Examples</h2> <p>The following query computes an approximation of the Mandelbrot Set and outputs the result as ASCII-art: </p><blockquote><pre> WITH RECURSIVE xaxis(x) AS (VALUES(-2.0) UNION ALL SELECT x+0.05 FROM xaxis WHERE x<1.2), yaxis(y) AS (VALUES(-1.0) UNION ALL SELECT y+0.1 FROM yaxis WHERE y<1.0), m(iter, cx, cy, x, y) AS ( SELECT 0, x, y, 0.0, 0.0 FROM xaxis, yaxis UNION ALL SELECT iter+1, cx, cy, x*x-y*y + cx, 2.0*x*y + cy FROM m |
658 659 660 661 662 663 664 | The "m2(iter,cx,cy)" CTE holds the maximum number of iterations reached when starting at point cx,cy. Finally, each row in the "a(t)" CTE holds a string which is a single line of the output ASCII-art. The SELECT statement at the end just queries the "a" CTE to retrieve all lines of ASCII-art, one by one. | | | | 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 | The "m2(iter,cx,cy)" CTE holds the maximum number of iterations reached when starting at point cx,cy. Finally, each row in the "a(t)" CTE holds a string which is a single line of the output ASCII-art. The SELECT statement at the end just queries the "a" CTE to retrieve all lines of ASCII-art, one by one. </p><p>Running the query above in an SQLite <a href="cli.html">command-line shell</a> results in the following output: </p><blockquote><pre> ....# ..#*.. ..+####+. .......+####.... + ..##+*##########+.++++ .+.##################+. .............+###################+.+ |
694 695 696 697 698 699 700 | <p>This next query solves a Sudoku puzzle. The state of the puzzle is defined by an 81-character string formed by reading entries from the puzzle box row by row from left to right and then from top to bottom. Blank squares in the puzzle are denoted by a "." character. Thus the input string: | | | | | | | | | | | | | | | 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 | <p>This next query solves a Sudoku puzzle. The state of the puzzle is defined by an 81-character string formed by reading entries from the puzzle box row by row from left to right and then from top to bottom. Blank squares in the puzzle are denoted by a "." character. Thus the input string: </p><blockquote> 53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79 </blockquote> <p>Corresponds to a puzzle like this: </p><blockquote> <table border="1" cellpadding="5"> <tr><td>5</td><td>3</td><td> </td><td> </td><td>7</td><td> </td><td> </td><td> </td><td> </td></tr><tr><td>6</td><td> </td><td> </td><td>1</td><td>9</td><td>5</td><td> </td><td> </td><td> </td></tr><tr><td> </td><td>9</td><td>8</td><td> </td><td> </td><td> </td><td> </td><td>6</td><td> </td></tr><tr><td>8</td><td> </td><td> </td><td> </td><td>6</td><td> </td><td> </td><td> </td><td>3 </td></tr><tr><td>4</td><td> </td><td> </td><td>8</td><td> </td><td>3</td><td> </td><td> </td><td>1 </td></tr><tr><td>7</td><td> </td><td> </td><td> </td><td>2</td><td> </td><td> </td><td> </td><td>6 </td></tr><tr><td> </td><td>6</td><td> </td><td> </td><td> </td><td> </td><td>2</td><td>8</td><td> </td></tr><tr><td> </td><td> </td><td> </td><td>4</td><td>1</td><td>9</td><td> </td><td> </td><td>5 </td></tr><tr><td> </td><td> </td><td> </td><td> </td><td>8</td><td> </td><td> </td><td>7</td><td>9 </td></tr></table> </blockquote> <p>This is the query that solves the puzzle: </p><blockquote><pre> WITH RECURSIVE input(sud) AS ( VALUES('53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') ), digits(z, lp) AS ( VALUES('1', 1) UNION ALL SELECT |
755 756 757 758 759 760 761 | The "digits" CTE defines a table that holds all digits between 1 and 9. The work of solving the puzzle is undertaken by the "x" CTE. An entry in x(s,ind) means that the 81-character string "s" is a valid sudoku puzzle (it has no conflicts) and that the first unknown character is at position "ind", or ind==0 if all character positions are filled in. The goal, then, is to compute entries for "x" with an "ind" of 0. | | | | | | | | < | 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 | The "digits" CTE defines a table that holds all digits between 1 and 9. The work of solving the puzzle is undertaken by the "x" CTE. An entry in x(s,ind) means that the 81-character string "s" is a valid sudoku puzzle (it has no conflicts) and that the first unknown character is at position "ind", or ind==0 if all character positions are filled in. The goal, then, is to compute entries for "x" with an "ind" of 0. </p><p>The solver works by adding new entries to the "x" recursive table. Given prior entries, the recursive-select tries to fill in a single new position with all values between 1 and 9 that actually work in that position. The complicated "NOT EXISTS" subquery is the magic that figures out whether or not each candidate "s" string is a valid sudoku puzzle or not. </p><p>The final answer is found by looking for a string with ind==0. If the original sudoku problem did not have a unique solution, then the query will return all possible solutions. If the original problem was unsolvable, then no rows will be returned. In this case, the unique answer is: </p><blockquote> 534678912672195348198342567859761423426853791713924856961537284287419635345286179 </blockquote> <p>The solution was computed in less than 300 milliseconds on a modern workstation. </p><h1 id="limitations_and_caveats"><span>4. </span>Limitations And Caveats</h1> <ul> <li><p> The WITH clause cannot be used within a <a href="lang_createtrigger.html">CREATE TRIGGER</a>. </p></li><li><p> The WITH clause must appear at the beginning of a top-level <a href="lang_select.html">SELECT</a> statement or at the beginning of a subquery. The WITH clause cannot be prepended to the second or subsequent SELECT statement of a <a href="lang_select.html#compound">compound select</a>. </p></li><li><p> The SQL:1999 spec requires that the RECURSIVE keyword follow WITH in any WITH clause that includes a recursive common table expression. However, for compatibility with SqlServer and Oracle, SQLite does not enforce this rule. </p></li></ul> |
Changes to Doc/Extra/Core/pragma.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
246 247 248 249 250 251 252 | feature becomes officially supported. <li><p> The table-valued functions for PRAGMA feature was added in SQLite version 3.16.0 (2017-01-02). Prior versions of SQLite cannot use this feature. </ul> | < | < | < < > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < < | < | | < | | | | | | | < | | | | | | | < | | < < < < | | | | | | | < > | | | | | | | > > > | < < < < < < < < < < < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 | feature becomes officially supported. <li><p> The table-valued functions for PRAGMA feature was added in SQLite version 3.16.0 (2017-01-02). Prior versions of SQLite cannot use this feature. </ul> <hr /><a name="toc"></a> <h2>List Of PRAGMAs</h2> <div class='columns' style='columns: 12em auto;'> <ul style='padding-top:0;'> <li><a href='pragma.html#pragma_analysis_limit'>analysis_limit</a></li> <li><a href='pragma.html#pragma_application_id'>application_id</a></li> <li><a href='pragma.html#pragma_auto_vacuum'>auto_vacuum</a></li> <li><a href='pragma.html#pragma_automatic_index'>automatic_index</a></li> <li><a href='pragma.html#pragma_busy_timeout'>busy_timeout</a></li> <li><a href='pragma.html#pragma_cache_size'>cache_size</a></li> <li><a href='pragma.html#pragma_cache_spill'>cache_spill</a></li> <li><a href='pragma.html#pragma_case_sensitive_like'>case_sensitive_like</a></li> <li><a href='pragma.html#pragma_cell_size_check'>cell_size_check</a></li> <li><a href='pragma.html#pragma_checkpoint_fullfsync'>checkpoint_fullfsync</a></li> <li><a href='pragma.html#pragma_collation_list'>collation_list</a></li> <li><a href='pragma.html#pragma_compile_options'>compile_options</a></li> <li><a href='pragma.html#pragma_count_changes'><s>count_changes¹</s></a></li> <li><a href='pragma.html#pragma_data_store_directory'><s>data_store_directory¹</s></a></li> <li><a href='pragma.html#pragma_data_version'>data_version</a></li> <li><a href='pragma.html#pragma_database_list'>database_list</a></li> <li><a href='pragma.html#pragma_default_cache_size'><s>default_cache_size¹</s></a></li> <li><a href='pragma.html#pragma_defer_foreign_keys'>defer_foreign_keys</a></li> <li><a href='pragma.html#pragma_empty_result_callbacks'><s>empty_result_callbacks¹</s></a></li> <li><a href='pragma.html#pragma_encoding'>encoding</a></li> <li><a href='pragma.html#pragma_foreign_key_check'>foreign_key_check</a></li> <li><a href='pragma.html#pragma_foreign_key_list'>foreign_key_list</a></li> <li><a href='pragma.html#pragma_foreign_keys'>foreign_keys</a></li> <li><a href='pragma.html#pragma_freelist_count'>freelist_count</a></li> <li><a href='pragma.html#pragma_full_column_names'><s>full_column_names¹</s></a></li> <li><a href='pragma.html#pragma_fullfsync'>fullfsync</a></li> <li><a href='pragma.html#pragma_function_list'>function_list</a></li> <li><a href='pragma.html#pragma_hard_heap_limit'>hard_heap_limit</a></li> <li><a href='pragma.html#pragma_ignore_check_constraints'>ignore_check_constraints</a></li> <li><a href='pragma.html#pragma_incremental_vacuum'>incremental_vacuum</a></li> <li><a href='pragma.html#pragma_index_info'>index_info</a></li> <li><a href='pragma.html#pragma_index_list'>index_list</a></li> <li><a href='pragma.html#pragma_index_xinfo'>index_xinfo</a></li> <li><a href='pragma.html#pragma_integrity_check'>integrity_check</a></li> <li><a href='pragma.html#pragma_journal_mode'>journal_mode</a></li> <li><a href='pragma.html#pragma_journal_size_limit'>journal_size_limit</a></li> <li><a href='pragma.html#pragma_legacy_alter_table'>legacy_alter_table</a></li> <li><a href='pragma.html#pragma_legacy_file_format'>legacy_file_format</a></li> <li><a href='pragma.html#pragma_locking_mode'>locking_mode</a></li> <li><a href='pragma.html#pragma_max_page_count'>max_page_count</a></li> <li><a href='pragma.html#pragma_mmap_size'>mmap_size</a></li> <li><a href='pragma.html#pragma_module_list'>module_list</a></li> <li><a href='pragma.html#pragma_optimize'>optimize</a></li> <li><a href='pragma.html#pragma_page_count'>page_count</a></li> <li><a href='pragma.html#pragma_page_size'>page_size</a></li> <li><a href='pragma.html#pragma_parser_trace'>parser_trace²</a></li> <li><a href='pragma.html#pragma_pragma_list'>pragma_list</a></li> <li><a href='pragma.html#pragma_query_only'>query_only</a></li> <li><a href='pragma.html#pragma_quick_check'>quick_check</a></li> <li><a href='pragma.html#pragma_read_uncommitted'>read_uncommitted</a></li> <li><a href='pragma.html#pragma_recursive_triggers'>recursive_triggers</a></li> <li><a href='pragma.html#pragma_reverse_unordered_selects'>reverse_unordered_selects</a></li> <li><a href='pragma.html#pragma_schema_version'>schema_version³</a></li> <li><a href='pragma.html#pragma_secure_delete'>secure_delete</a></li> <li><a href='pragma.html#pragma_short_column_names'><s>short_column_names¹</s></a></li> <li><a href='pragma.html#pragma_shrink_memory'>shrink_memory</a></li> <li><a href='pragma.html#pragma_soft_heap_limit'>soft_heap_limit</a></li> <li><a href='pragma.html#pragma_stats'>stats³</a></li> <li><a href='pragma.html#pragma_synchronous'>synchronous</a></li> <li><a href='pragma.html#pragma_table_info'>table_info</a></li> <li><a href='pragma.html#pragma_table_xinfo'>table_xinfo</a></li> <li><a href='pragma.html#pragma_temp_store'>temp_store</a></li> <li><a href='pragma.html#pragma_temp_store_directory'><s>temp_store_directory¹</s></a></li> <li><a href='pragma.html#pragma_threads'>threads</a></li> <li><a href='pragma.html#pragma_trusted_schema'>trusted_schema</a></li> <li><a href='pragma.html#pragma_user_version'>user_version</a></li> <li><a href='pragma.html#pragma_vdbe_addoptrace'>vdbe_addoptrace²</a></li> <li><a href='pragma.html#pragma_vdbe_debug'>vdbe_debug²</a></li> <li><a href='pragma.html#pragma_vdbe_listing'>vdbe_listing²</a></li> <li><a href='pragma.html#pragma_vdbe_trace'>vdbe_trace²</a></li> <li><a href='pragma.html#pragma_wal_autocheckpoint'>wal_autocheckpoint</a></li> <li><a href='pragma.html#pragma_wal_checkpoint'>wal_checkpoint</a></li> <li><a href='pragma.html#pragma_writable_schema'>writable_schema³</a></li> </ul> </div> <p>Notes: <ol> <li>Pragmas whose names are <s>struck through</s> are deprecated. Do not use them. They exist for historical compatibility. <li>These pragmas are only available in builds using non-standard compile-time options. <li>These pragmas are used for testing SQLite and are not recommended for use in application programs.</ol></p> <a name="pragma_analysis_limit"></a> <h _id=pragma_analysis_limit style="display:none"> PRAGMA analysis_limit</h><hr> <p><b>PRAGMA analysis_limit; <br>PRAGMA analysis_limit = </b><i>N</i><b>;</b></p> <p>Query or change a limit on the <a href="lang_analyze.html#approx">approximate ANALYZE</a> setting. This is approximate number of rows examined in each index by the <a href="lang_analyze.html">ANALYZE</a> command. If the argument <i>N</i> is omitted, then the analysis limit is unchanged. If the limit is zero, then the analysis limit is disabled and the ANALYZE command will examine all rows of each index. If N is greater than zero, then the analysis limit is set to N and subsequent ANALYZE commands will breaks off processing each index after it has examined approximately N rows. If N is a negative number or something other than an integer value, then the pragma behaves as if the N argument was omitted. In all cases, the value returned is the new analysis limit used for subsequent ANALYZE commands. <p>This pragma can be used to help the ANALYZE command run faster on large databases. The results of analysis are not as good when only part of each index is examined, but the results are usually good enough. Setting N to 100 or 1000 allows the ANALYZE command to run very quickly, even on multi-gigabyte database files. This pragma is particularly useful in combination with <a href="pragma.html#pragma_optimize">PRAGMA optimize</a>. <p>This pragma was added in SQLite version 3.32.0 (2020-05-22). The current implementation only uses the lower 31 bits of the N value - higher order bits are silently ignored. Future versions of SQLite might begin using higher order bits. <a name="pragma_application_id"></a> <h _id=pragma_application_id style="display:none"> PRAGMA application_id</h><hr> <p><b>PRAGMA </b><i>schema.</i><b>application_id; <br>PRAGMA </b><i>schema.</i><b>application_id = </b><i>integer </i><b>;</b> <p>The application_id PRAGMA is used to query or set the 32-bit signed big-endian "Application ID" integer located at offset 68 into the <a href="fileformat2.html#database_header">database header</a>. Applications that use SQLite as their <a href="appfileformat.html">application file-format</a> should set the Application ID integer to a unique integer so that utilities such as <a href="http://www.darwinsys.com/file/">file(1)</a> can determine the specific file type rather than just reporting "SQLite3 Database". A list of assigned application IDs can be seen by consulting the |
601 602 603 604 605 606 607 | <p>Query or change the count-changes flag. Normally, when the count-changes flag is not set, <a href="lang_insert.html">INSERT</a>, <a href="lang_update.html">UPDATE</a> and <a href="lang_delete.html">DELETE</a> statements return no data. When count-changes is set, each of these commands returns a single row of data consisting of one integer value - the number of rows inserted, modified or deleted by the command. The returned change count does not include any insertions, modifications or deletions performed by triggers, any changes made automatically | | | 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 | <p>Query or change the count-changes flag. Normally, when the count-changes flag is not set, <a href="lang_insert.html">INSERT</a>, <a href="lang_update.html">UPDATE</a> and <a href="lang_delete.html">DELETE</a> statements return no data. When count-changes is set, each of these commands returns a single row of data consisting of one integer value - the number of rows inserted, modified or deleted by the command. The returned change count does not include any insertions, modifications or deletions performed by triggers, any changes made automatically by <a href="foreignkeys.html#fk_actions">foreign key actions</a>, or updates caused by an <a href="lang_upsert.html">upsert</a>.</p> <p>Another way to get the row change counts is to use the <a href="c3ref/changes.html">sqlite3_changes()</a> or <a href="c3ref/total_changes.html">sqlite3_total_changes()</a> interfaces. There is a subtle different, though. When an INSERT, UPDATE, or DELETE is run against a view using an <a href="lang_createtrigger.html#instead_of_trigger">INSTEAD OF trigger</a>, the count_changes pragma reports the number of rows in the view that fired the trigger, whereas <a href="c3ref/changes.html">sqlite3_changes()</a> and |
1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 | <p>For compatibility with older <a href="vtab.html">virtual table</a> implementations, this flag is turned on temporarily while the <a href="vtab.html#xrename">sqlite3_module.xRename</a> method is being run. The value of this flag is restore after the <a href="vtab.html#xrename">sqlite3_module.xRename</a> method finishes. <p>The legacy alter table behavior can also be toggled on and off using the <a href="c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyaltertable">SQLITE_DBCONFIG_LEGACY_ALTER_TABLE</a> option to the <a href="c3ref/db_config.html">sqlite3_db_config()</a> interface. <a name="pragma_legacy_file_format"></a> <h _id=pragma_legacy_file_format style="display:none"> PRAGMA legacy_file_format</h><hr> <p><b>PRAGMA legacy_file_format;</b> <p>This pragma no longer functions. It has become a no-op. The capabilities formerly provided by PRAGMA legacy_file_format are now available using the <a href="c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyfileformat">SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</a> option to the <a href="c3ref/db_config.html">sqlite3_db_config()</a> C-language interface. | > > > > > | 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 | <p>For compatibility with older <a href="vtab.html">virtual table</a> implementations, this flag is turned on temporarily while the <a href="vtab.html#xrename">sqlite3_module.xRename</a> method is being run. The value of this flag is restore after the <a href="vtab.html#xrename">sqlite3_module.xRename</a> method finishes. <p>The legacy alter table behavior can also be toggled on and off using the <a href="c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyaltertable">SQLITE_DBCONFIG_LEGACY_ALTER_TABLE</a> option to the <a href="c3ref/db_config.html">sqlite3_db_config()</a> interface. <p>The legacy alter table behavior is a per-connection setting. Turning this features on or off affects all attached database files within the <a href="c3ref/sqlite3.html">database connection</a>. The setting does not persist. Changing this setting in one connection does not affect any other connections. <a name="pragma_legacy_file_format"></a> <h _id=pragma_legacy_file_format style="display:none"> PRAGMA legacy_file_format</h><hr> <p><b>PRAGMA legacy_file_format;</b> <p>This pragma no longer functions. It has become a no-op. The capabilities formerly provided by PRAGMA legacy_file_format are now available using the <a href="c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyfileformat">SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</a> option to the <a href="c3ref/db_config.html">sqlite3_db_config()</a> C-language interface. |
1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 | <p>This pragma is usually a no-op or nearly so and is very fast. However if SQLite feels that performing database optimizations (such as running <a href="lang_analyze.html">ANALYZE</a> or creating new indexes) will improve the performance of future queries, then some database I/O may be done. Applications that want to limit the amount of work performed can set a timer that will invoke <a href="c3ref/interrupt.html">sqlite3_interrupt()</a> if the pragma goes on for too long. </p> <p>The details of optimizations performed by this pragma are expected to change and improve over time. Applications should anticipate that this pragma will perform new optimizations in future releases.</p> <p>The optional MASK argument is a bitmask of optimizations to perform: <ol> | > > > > | 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 | <p>This pragma is usually a no-op or nearly so and is very fast. However if SQLite feels that performing database optimizations (such as running <a href="lang_analyze.html">ANALYZE</a> or creating new indexes) will improve the performance of future queries, then some database I/O may be done. Applications that want to limit the amount of work performed can set a timer that will invoke <a href="c3ref/interrupt.html">sqlite3_interrupt()</a> if the pragma goes on for too long. Or, since SQLite 3.32.0, the application can use <a href="pragma.html#pragma_analysis_limit">PRAGMA analysis_limit=<i>N</i></a> for some small value of <i>N</i> (a few hundred or a few thousand) to limit the depth of analyze. </p> <p>The details of optimizations performed by this pragma are expected to change and improve over time. Applications should anticipate that this pragma will perform new optimizations in future releases.</p> <p>The optional MASK argument is a bitmask of optimizations to perform: <ol> |
Changes to Doc/Extra/Core/sqlite.css.
282 283 284 285 286 287 288 | } th.sort.asc:after { content: '\2193'; } th.sort.desc:after { content: '\2191' } | > > > > > > > > > > > > > > > > > > > > | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 | } th.sort.asc:after { content: '\2193'; } th.sort.desc:after { content: '\2191' } div.columns { padding: 0 2em 0 2em; max-width: 2000px; } div.columns > ul { margin: 0; padding: 0 0 0 1em; list-style-type: none; padding: 10px; margin: 0px; white-space: nowrap; } div.columns > ul li:first-child { margin-top:0px; } .columns li { break-inside: avoid; page-break-inside: avoid; } |
Changes to Doc/Extra/Core/syntax.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
91 92 93 94 95 96 97 | } </script> </div> <h1 align="center">List of SQLite Syntax Diagrams</h1> | | < | < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < < | | | | | | | < | | | | | | | | | | | < < < < < < < | | | | | | < > | | | < | > | | > > > | < < < < < < < < < < < | | 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 | } </script> </div> <h1 align="center">List of SQLite Syntax Diagrams</h1> <div class='columns' style='columns: 15em auto;'> <ul style='padding-top:0;'> <li><a href='syntax/aggregate-function-invocation.html'>aggregate-function-invocation</a></li> <li><a href='syntax/alter-table-stmt.html'>alter-table-stmt</a></li> <li><a href='syntax/analyze-stmt.html'>analyze-stmt</a></li> <li><a href='syntax/attach-stmt.html'>attach-stmt</a></li> <li><a href='syntax/begin-stmt.html'>begin-stmt</a></li> <li><a href='syntax/column-constraint.html'>column-constraint</a></li> <li><a href='syntax/column-def.html'>column-def</a></li> <li><a href='syntax/column-name-list.html'>column-name-list</a></li> <li><a href='syntax/comment-syntax.html'>comment-syntax</a></li> <li><a href='syntax/commit-stmt.html'>commit-stmt</a></li> <li><a href='syntax/common-table-expression.html'>common-table-expression</a></li> <li><a href='syntax/compound-operator.html'>compound-operator</a></li> <li><a href='syntax/compound-select-stmt.html'>compound-select-stmt</a></li> <li><a href='syntax/conflict-clause.html'>conflict-clause</a></li> <li><a href='syntax/create-index-stmt.html'>create-index-stmt</a></li> <li><a href='syntax/create-table-stmt.html'>create-table-stmt</a></li> <li><a href='syntax/create-trigger-stmt.html'>create-trigger-stmt</a></li> <li><a href='syntax/create-view-stmt.html'>create-view-stmt</a></li> <li><a href='syntax/create-virtual-table-stmt.html'>create-virtual-table-stmt</a></li> <li><a href='syntax/cte-table-name.html'>cte-table-name</a></li> <li><a href='syntax/delete-stmt.html'>delete-stmt</a></li> <li><a href='syntax/delete-stmt-limited.html'>delete-stmt-limited</a></li> <li><a href='syntax/detach-stmt.html'>detach-stmt</a></li> <li><a href='syntax/drop-index-stmt.html'>drop-index-stmt</a></li> <li><a href='syntax/drop-table-stmt.html'>drop-table-stmt</a></li> <li><a href='syntax/drop-trigger-stmt.html'>drop-trigger-stmt</a></li> <li><a href='syntax/drop-view-stmt.html'>drop-view-stmt</a></li> <li><a href='syntax/expr.html'>expr</a></li> <li><a href='syntax/factored-select-stmt.html'>factored-select-stmt</a></li> <li><a href='syntax/filter-clause.html'>filter-clause</a></li> <li><a href='syntax/foreign-key-clause.html'>foreign-key-clause</a></li> <li><a href='syntax/frame-spec.html'>frame-spec</a></li> <li><a href='syntax/indexed-column.html'>indexed-column</a></li> <li><a href='syntax/insert-stmt.html'>insert-stmt</a></li> <li><a href='syntax/join-clause.html'>join-clause</a></li> <li><a href='syntax/join-constraint.html'>join-constraint</a></li> <li><a href='syntax/join-operator.html'>join-operator</a></li> <li><a href='syntax/literal-value.html'>literal-value</a></li> <li><a href='syntax/numeric-literal.html'>numeric-literal</a></li> <li><a href='syntax/ordering-term.html'>ordering-term</a></li> <li><a href='syntax/over-clause.html'>over-clause</a></li> <li><a href='syntax/pragma-stmt.html'>pragma-stmt</a></li> <li><a href='syntax/pragma-value.html'>pragma-value</a></li> <li><a href='syntax/qualified-table-name.html'>qualified-table-name</a></li> <li><a href='syntax/raise-function.html'>raise-function</a></li> <li><a href='syntax/recursive-cte.html'>recursive-cte</a></li> <li><a href='syntax/reindex-stmt.html'>reindex-stmt</a></li> <li><a href='syntax/release-stmt.html'>release-stmt</a></li> <li><a href='syntax/result-column.html'>result-column</a></li> <li><a href='syntax/rollback-stmt.html'>rollback-stmt</a></li> <li><a href='syntax/savepoint-stmt.html'>savepoint-stmt</a></li> <li><a href='syntax/select-core.html'>select-core</a></li> <li><a href='syntax/select-stmt.html'>select-stmt</a></li> <li><a href='syntax/signed-number.html'>signed-number</a></li> <li><a href='syntax/simple-function-invocation.html'>simple-function-invocation</a></li> <li><a href='syntax/simple-select-stmt.html'>simple-select-stmt</a></li> <li><a href='syntax/sql-stmt.html'>sql-stmt</a></li> <li><a href='syntax/sql-stmt-list.html'>sql-stmt-list</a></li> <li><a href='syntax/table-constraint.html'>table-constraint</a></li> <li><a href='syntax/table-or-subquery.html'>table-or-subquery</a></li> <li><a href='syntax/type-name.html'>type-name</a></li> <li><a href='syntax/update-stmt.html'>update-stmt</a></li> <li><a href='syntax/update-stmt-limited.html'>update-stmt-limited</a></li> <li><a href='syntax/upsert-clause.html'>upsert-clause</a></li> <li><a href='syntax/vacuum-stmt.html'>vacuum-stmt</a></li> <li><a href='syntax/window-defn.html'>window-defn</a></li> <li><a href='syntax/window-function-invocation.html'>window-function-invocation</a></li> <li><a href='syntax/with-clause.html'>with-clause</a></li> </ul> </div> |
Changes to Doc/Extra/Core/syntax/alter-table-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/analyze-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/attach-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/begin-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/column-constraint.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/column-def.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/column-name-list.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>column-name-list</h1> <div class='imgcontainer'> <img alt="syntax diagram column-name-list" src="../images/syntax/column-name-list.gif"></img><br> Used by: <a href='./update-stmt.html'>update-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./upsert-clause.html'>upsert-clause</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>column-name-list</h1> <div class='imgcontainer'> <img alt="syntax diagram column-name-list" src="../images/syntax/column-name-list.gif"></img><br> Used by: <a href='./update-stmt.html'>update-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./upsert-clause.html'>upsert-clause</a><br></br> See also: <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> </div> |
Changes to Doc/Extra/Core/syntax/comment-syntax.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/commit-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/common-table-expression.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>common-table-expression</h1> <div class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="../images/syntax/common-table-expression.gif"></img><br> Used by: <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a><br></br> References: <a href='./select-stmt.html'>select-stmt</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>common-table-expression</h1> <div class='imgcontainer'> <img alt="syntax diagram common-table-expression" src="../images/syntax/common-table-expression.gif"></img><br> Used by: <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a><br></br> References: <a href='./select-stmt.html'>select-stmt</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/compound-operator.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>compound-operator</h1> <div class='imgcontainer'> <img alt="syntax diagram compound-operator" src="../images/syntax/compound-operator.gif"></img><br> Used by: <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./select-stmt.html'>select-stmt</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>compound-operator</h1> <div class='imgcontainer'> <img alt="syntax diagram compound-operator" src="../images/syntax/compound-operator.gif"></img><br> Used by: <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./select-stmt.html'>select-stmt</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/compound-select-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/conflict-clause.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/create-index-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/create-table-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/create-trigger-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/create-view-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/create-virtual-table-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/cte-table-name.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/delete-stmt-limited.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/delete-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/detach-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/drop-index-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/drop-table-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/drop-trigger-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/drop-view-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/expr.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>expr</h1> <div class='imgcontainer'> <img alt="syntax diagram expr" src="../images/syntax/expr.gif"></img><br> Used by: <a href='./aggregate-function-invocation.html'>aggregate-function-invocation</a> <a href='./attach-stmt.html'>attach-stmt</a> <a href='./column-constraint.html'>column-constraint</a> <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./create-index-stmt.html'>create-index-stmt</a> <a href='./create-trigger-stmt.html'>create-trigger-stmt</a> <a href='./delete-stmt.html'>delete-stmt</a> <a href='./delete-stmt-limited.html'>delete-stmt-limited</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./filter-clause.html'>filter-clause</a> <a href='./frame-spec.html'>frame-spec</a> <a href='./indexed-column.html'>indexed-column</a> <a href='./insert-stmt.html'>insert-stmt</a> <a href='./join-constraint.html'>join-constraint</a> <a href='./ordering-term.html'>ordering-term</a> <a href='./over-clause.html'>over-clause</a> <a href='./result-column.html'>result-column</a> <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-function-invocation.html'>simple-function-invocation</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a> <a href='./table-constraint.html'>table-constraint</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./update-stmt.html'>update-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./upsert-clause.html'>upsert-clause</a> <a href='./window-defn.html'>window-defn</a> <a href='./window-function-invocation.html'>window-function-invocation</a><br></br> References: <a href='./filter-clause.html'>filter-clause</a> <a href='./literal-value.html'>literal-value</a> <a href='./over-clause.html'>over-clause</a> <a href='./raise-function.html'>raise-function</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./type-name.html'>type-name</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>expr</h1> <div class='imgcontainer'> <img alt="syntax diagram expr" src="../images/syntax/expr.gif"></img><br> Used by: <a href='./aggregate-function-invocation.html'>aggregate-function-invocation</a> <a href='./attach-stmt.html'>attach-stmt</a> <a href='./column-constraint.html'>column-constraint</a> <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./create-index-stmt.html'>create-index-stmt</a> <a href='./create-trigger-stmt.html'>create-trigger-stmt</a> <a href='./delete-stmt.html'>delete-stmt</a> <a href='./delete-stmt-limited.html'>delete-stmt-limited</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./filter-clause.html'>filter-clause</a> <a href='./frame-spec.html'>frame-spec</a> <a href='./indexed-column.html'>indexed-column</a> <a href='./insert-stmt.html'>insert-stmt</a> <a href='./join-constraint.html'>join-constraint</a> <a href='./ordering-term.html'>ordering-term</a> <a href='./over-clause.html'>over-clause</a> <a href='./result-column.html'>result-column</a> <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-function-invocation.html'>simple-function-invocation</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a> <a href='./table-constraint.html'>table-constraint</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./update-stmt.html'>update-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./upsert-clause.html'>upsert-clause</a> <a href='./window-defn.html'>window-defn</a> <a href='./window-function-invocation.html'>window-function-invocation</a><br></br> References: <a href='./filter-clause.html'>filter-clause</a> <a href='./literal-value.html'>literal-value</a> <a href='./over-clause.html'>over-clause</a> <a href='./raise-function.html'>raise-function</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./type-name.html'>type-name</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/factored-select-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/foreign-key-clause.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/indexed-column.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>indexed-column</h1> <div class='imgcontainer'> <img alt="syntax diagram indexed-column" src="../images/syntax/indexed-column.gif"></img><br> Used by: <a href='./create-index-stmt.html'>create-index-stmt</a> <a href='./table-constraint.html'>table-constraint</a> <a href='./upsert-clause.html'>upsert-clause</a><br></br> References: <a href='./expr.html'>expr</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>indexed-column</h1> <div class='imgcontainer'> <img alt="syntax diagram indexed-column" src="../images/syntax/indexed-column.gif"></img><br> Used by: <a href='./create-index-stmt.html'>create-index-stmt</a> <a href='./table-constraint.html'>table-constraint</a> <a href='./upsert-clause.html'>upsert-clause</a><br></br> References: <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/insert-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/join-clause.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>join-clause</h1> <div class='imgcontainer'> <img alt="syntax diagram join-clause" src="../images/syntax/join-clause.gif"></img><br> Used by: <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./table-or-subquery.html'>table-or-subquery</a><br></br> References: <a href='./join-constraint.html'>join-constraint</a> <a href='./join-operator.html'>join-operator</a> <a href='./table-or-subquery.html'>table-or-subquery</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>join-clause</h1> <div class='imgcontainer'> <img alt="syntax diagram join-clause" src="../images/syntax/join-clause.gif"></img><br> Used by: <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./table-or-subquery.html'>table-or-subquery</a><br></br> References: <a href='./join-constraint.html'>join-constraint</a> <a href='./join-operator.html'>join-operator</a> <a href='./table-or-subquery.html'>table-or-subquery</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/join-constraint.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>join-constraint</h1> <div class='imgcontainer'> <img alt="syntax diagram join-constraint" src="../images/syntax/join-constraint.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a><br></br> References: <a href='./expr.html'>expr</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>join-constraint</h1> <div class='imgcontainer'> <img alt="syntax diagram join-constraint" src="../images/syntax/join-constraint.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a><br></br> References: <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/join-operator.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>join-operator</h1> <div class='imgcontainer'> <img alt="syntax diagram join-operator" src="../images/syntax/join-operator.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>join-operator</h1> <div class='imgcontainer'> <img alt="syntax diagram join-operator" src="../images/syntax/join-operator.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/literal-value.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>literal-value</h1> <div class='imgcontainer'> <img alt="syntax diagram literal-value" src="../images/syntax/literal-value.gif"></img><br> Used by: <a href='./column-constraint.html'>column-constraint</a> <a href='./expr.html'>expr</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>literal-value</h1> <div class='imgcontainer'> <img alt="syntax diagram literal-value" src="../images/syntax/literal-value.gif"></img><br> Used by: <a href='./column-constraint.html'>column-constraint</a> <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/numeric-literal.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/ordering-term.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>ordering-term</h1> <div class='imgcontainer'> <img alt="syntax diagram ordering-term" src="../images/syntax/ordering-term.gif"></img><br> Used by: <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./delete-stmt-limited.html'>delete-stmt-limited</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./over-clause.html'>over-clause</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./window-defn.html'>window-defn</a><br></br> References: <a href='./expr.html'>expr</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>ordering-term</h1> <div class='imgcontainer'> <img alt="syntax diagram ordering-term" src="../images/syntax/ordering-term.gif"></img><br> Used by: <a href='./compound-select-stmt.html'>compound-select-stmt</a> <a href='./delete-stmt-limited.html'>delete-stmt-limited</a> <a href='./factored-select-stmt.html'>factored-select-stmt</a> <a href='./over-clause.html'>over-clause</a> <a href='./select-stmt.html'>select-stmt</a> <a href='./simple-select-stmt.html'>simple-select-stmt</a> <a href='./update-stmt-limited.html'>update-stmt-limited</a> <a href='./window-defn.html'>window-defn</a><br></br> References: <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/pragma-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/pragma-value.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/qualified-table-name.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/raise-function.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>raise-function</h1> <div class='imgcontainer'> <img alt="syntax diagram raise-function" src="../images/syntax/raise-function.gif"></img><br> Used by: <a href='./expr.html'>expr</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>raise-function</h1> <div class='imgcontainer'> <img alt="syntax diagram raise-function" src="../images/syntax/raise-function.gif"></img><br> Used by: <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/recursive-cte.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/reindex-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/release-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/result-column.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>result-column</h1> <div class='imgcontainer'> <img alt="syntax diagram result-column" src="../images/syntax/result-column.gif"></img><br> Used by: <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a><br></br> References: <a href='./expr.html'>expr</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>result-column</h1> <div class='imgcontainer'> <img alt="syntax diagram result-column" src="../images/syntax/result-column.gif"></img><br> Used by: <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a><br></br> References: <a href='./expr.html'>expr</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/rollback-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/savepoint-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/select-core.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/select-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>select-stmt</h1> <div class='imgcontainer'> <img alt="syntax diagram select-stmt" src="../images/syntax/select-stmt.gif"></img><br> Used by: <a href='./common-table-expression.html'>common-table-expression</a> <a href='./create-table-stmt.html'>create-table-stmt</a> <a href='./create-trigger-stmt.html'>create-trigger-stmt</a> <a href='./create-view-stmt.html'>create-view-stmt</a> <a href='./expr.html'>expr</a> <a href='./insert-stmt.html'>insert-stmt</a> <a href='./sql-stmt.html'>sql-stmt</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./with-clause.html'>with-clause</a><br></br> References: <a href='./common-table-expression.html'>common-table-expression</a> <a href='./compound-operator.html'>compound-operator</a> <a href='./expr.html'>expr</a> <a href='./join-clause.html'>join-clause</a> <a href='./ordering-term.html'>ordering-term</a> <a href='./result-column.html'>result-column</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./window-defn.html'>window-defn</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>select-stmt</h1> <div class='imgcontainer'> <img alt="syntax diagram select-stmt" src="../images/syntax/select-stmt.gif"></img><br> Used by: <a href='./common-table-expression.html'>common-table-expression</a> <a href='./create-table-stmt.html'>create-table-stmt</a> <a href='./create-trigger-stmt.html'>create-trigger-stmt</a> <a href='./create-view-stmt.html'>create-view-stmt</a> <a href='./expr.html'>expr</a> <a href='./insert-stmt.html'>insert-stmt</a> <a href='./sql-stmt.html'>sql-stmt</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./with-clause.html'>with-clause</a><br></br> References: <a href='./common-table-expression.html'>common-table-expression</a> <a href='./compound-operator.html'>compound-operator</a> <a href='./expr.html'>expr</a> <a href='./join-clause.html'>join-clause</a> <a href='./ordering-term.html'>ordering-term</a> <a href='./result-column.html'>result-column</a> <a href='./table-or-subquery.html'>table-or-subquery</a> <a href='./window-defn.html'>window-defn</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/signed-number.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
92 93 94 95 96 97 98 | </script> </div> <h1 align='center'>signed-number</h1> <div class='imgcontainer'> <img alt="syntax diagram signed-number" src="../images/syntax/signed-number.gif"></img><br> Used by: <a href='./column-constraint.html'>column-constraint</a> <a href='./pragma-value.html'>pragma-value</a> <a href='./type-name.html'>type-name</a><br></br> | | | 92 93 94 95 96 97 98 99 100 101 102 | </script> </div> <h1 align='center'>signed-number</h1> <div class='imgcontainer'> <img alt="syntax diagram signed-number" src="../images/syntax/signed-number.gif"></img><br> Used by: <a href='./column-constraint.html'>column-constraint</a> <a href='./pragma-value.html'>pragma-value</a> <a href='./type-name.html'>type-name</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> <a href='../pragma.html'>pragma.html</a> </div> |
Changes to Doc/Extra/Core/syntax/simple-select-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/sql-stmt-list.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/sql-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/table-constraint.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/table-or-subquery.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>table-or-subquery</h1> <div class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="../images/syntax/table-or-subquery.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a> <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a><br></br> References: <a href='./expr.html'>expr</a> <a href='./join-clause.html'>join-clause</a> <a href='./select-stmt.html'>select-stmt</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>table-or-subquery</h1> <div class='imgcontainer'> <img alt="syntax diagram table-or-subquery" src="../images/syntax/table-or-subquery.gif"></img><br> Used by: <a href='./join-clause.html'>join-clause</a> <a href='./select-core.html'>select-core</a> <a href='./select-stmt.html'>select-stmt</a><br></br> References: <a href='./expr.html'>expr</a> <a href='./join-clause.html'>join-clause</a> <a href='./select-stmt.html'>select-stmt</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/type-name.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
93 94 95 96 97 98 99 | </div> <h1 align='center'>type-name</h1> <div class='imgcontainer'> <img alt="syntax diagram type-name" src="../images/syntax/type-name.gif"></img><br> Used by: <a href='./column-def.html'>column-def</a> <a href='./expr.html'>expr</a><br></br> References: <a href='./signed-number.html'>signed-number</a><br></br> | | | 93 94 95 96 97 98 99 100 101 102 103 | </div> <h1 align='center'>type-name</h1> <div class='imgcontainer'> <img alt="syntax diagram type-name" src="../images/syntax/type-name.gif"></img><br> Used by: <a href='./column-def.html'>column-def</a> <a href='./expr.html'>expr</a><br></br> References: <a href='./signed-number.html'>signed-number</a><br></br> See also: <a href='../lang_aggfunc.html'>lang_aggfunc.html</a> <a href='../lang_altertable.html'>lang_altertable.html</a> <a href='../lang_attach.html'>lang_attach.html</a> <a href='../lang_createindex.html'>lang_createindex.html</a> <a href='../lang_createtable.html'>lang_createtable.html</a> <a href='../lang_createtrigger.html'>lang_createtrigger.html</a> <a href='../lang_createview.html'>lang_createview.html</a> <a href='../lang_delete.html'>lang_delete.html</a> <a href='../lang_expr.html'>lang_expr.html</a> <a href='../lang_insert.html'>lang_insert.html</a> <a href='../lang_select.html'>lang_select.html</a> <a href='../lang_update.html'>lang_update.html</a> <a href='../lang_upsert.html'>lang_upsert.html</a> <a href='../lang_with.html'>lang_with.html</a> <a href='../partialindex.html'>partialindex.html</a> </div> |
Changes to Doc/Extra/Core/syntax/update-stmt-limited.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/update-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/vacuum-stmt.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntax/with-clause.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
Changes to Doc/Extra/Core/syntaxdiagrams.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
166 167 168 169 170 171 172 | See also: <a href="lang_createindex.html">lang_createindex.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="indexed-column"></a><h4>indexed-column:</h4><div class='imgcontainer'> <img src="images/syntax/indexed-column.gif"></img><br></br> Used by: <a href="#create-index-stmt">create-index-stmt</a> <a href="#table-constraint">table-constraint</a> <a href="#upsert-clause">upsert-clause</a><br></br> References: <a href="#expr">expr</a><br></br> | | | | | 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 | See also: <a href="lang_createindex.html">lang_createindex.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="indexed-column"></a><h4>indexed-column:</h4><div class='imgcontainer'> <img src="images/syntax/indexed-column.gif"></img><br></br> Used by: <a href="#create-index-stmt">create-index-stmt</a> <a href="#table-constraint">table-constraint</a> <a href="#upsert-clause">upsert-clause</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtable.html#primkeyconst">lang_createtable.html#primkeyconst</a> <a href="lang_createtable.html#uniqueconst">lang_createtable.html#uniqueconst</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="create-table-stmt"></a><h4>create-table-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/create-table-stmt.gif"></img><br></br> Used by: <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#column-def">column-def</a> <a href="#select-stmt">select-stmt</a> <a href="#table-constraint">table-constraint</a><br></br> See also: <a href="lang_createtable.html">lang_createtable.html</a> </div> <a name="column-def"></a><h4>column-def:</h4><div class='imgcontainer'> <img src="images/syntax/column-def.gif"></img><br></br> Used by: <a href="#alter-table-stmt">alter-table-stmt</a> <a href="#create-table-stmt">create-table-stmt</a><br></br> References: <a href="#column-constraint">column-constraint</a> <a href="#type-name">type-name</a><br></br> See also: <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_altertable.html#altertabaddcol">lang_altertable.html#altertabaddcol</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtable.html#tablecoldef">lang_createtable.html#tablecoldef</a> </div> <a name="type-name"></a><h4>type-name:</h4><div class='imgcontainer'> <img src="images/syntax/type-name.gif"></img><br></br> Used by: <a href="#column-def">column-def</a> <a href="#expr">expr</a><br></br> References: <a href="#signed-number">signed-number</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="column-constraint"></a><h4>column-constraint:</h4><div class='imgcontainer'> <img src="images/syntax/column-constraint.gif"></img><br></br> Used by: <a href="#column-def">column-def</a><br></br> References: <a href="#conflict-clause">conflict-clause</a> <a href="#expr">expr</a> <a href="#foreign-key-clause">foreign-key-clause</a> <a href="#literal-value">literal-value</a> <a href="#signed-number">signed-number</a><br></br> See also: <a href="gencol.html">gencol.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtable.html#tablecoldef">lang_createtable.html#tablecoldef</a> </div> <a name="signed-number"></a><h4>signed-number:</h4><div class='imgcontainer'> <img src="images/syntax/signed-number.gif"></img><br></br> Used by: <a href="#column-constraint">column-constraint</a> <a href="#pragma-value">pragma-value</a> <a href="#type-name">type-name</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> <a href="pragma.html#syntax">pragma.html#syntax</a> </div> <a name="table-constraint"></a><h4>table-constraint:</h4><div class='imgcontainer'> <img src="images/syntax/table-constraint.gif"></img><br></br> Used by: <a href="#create-table-stmt">create-table-stmt</a><br></br> References: <a href="#conflict-clause">conflict-clause</a> <a href="#expr">expr</a> <a href="#foreign-key-clause">foreign-key-clause</a> <a href="#indexed-column">indexed-column</a><br></br> See also: <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtable.html#primkeyconst">lang_createtable.html#primkeyconst</a> <a href="lang_createtable.html#tablecoldef">lang_createtable.html#tablecoldef</a> <a href="lang_createtable.html#uniqueconst">lang_createtable.html#uniqueconst</a> |
265 266 267 268 269 270 271 | See also: <a href="lang_with.html#recursivecte">lang_with.html#recursivecte</a> </div> <a name="common-table-expression"></a><h4>common-table-expression:</h4><div class='imgcontainer'> <img src="images/syntax/common-table-expression.gif"></img><br></br> Used by: <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#select-stmt">select-stmt</a> <a href="#simple-select-stmt">simple-select-stmt</a><br></br> References: <a href="#select-stmt">select-stmt</a><br></br> | | | 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | See also: <a href="lang_with.html#recursivecte">lang_with.html#recursivecte</a> </div> <a name="common-table-expression"></a><h4>common-table-expression:</h4><div class='imgcontainer'> <img src="images/syntax/common-table-expression.gif"></img><br></br> Used by: <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#select-stmt">select-stmt</a> <a href="#simple-select-stmt">simple-select-stmt</a><br></br> References: <a href="#select-stmt">select-stmt</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="delete-stmt"></a><h4>delete-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/delete-stmt.gif"></img><br></br> Used by: <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#expr">expr</a> <a href="#qualified-table-name">qualified-table-name</a> <a href="#with-clause">with-clause</a><br></br> See also: <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_delete.html">lang_delete.html</a> |
316 317 318 319 320 321 322 | See also: <a href="lang_dropview.html">lang_dropview.html</a> </div> <a name="expr"></a><h4>expr:</h4><div class='imgcontainer'> <img src="images/syntax/expr.gif"></img><br></br> Used by: <a href="#aggregate-function-invocation">aggregate-function-invocation</a> <a href="#attach-stmt">attach-stmt</a> <a href="#column-constraint">column-constraint</a> <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#create-index-stmt">create-index-stmt</a> <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#delete-stmt">delete-stmt</a> <a href="#delete-stmt-limited">delete-stmt-limited</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#filter-clause">filter-clause</a> <a href="#frame-spec">frame-spec</a> <a href="#indexed-column">indexed-column</a> <a href="#insert-stmt">insert-stmt</a> <a href="#join-constraint">join-constraint</a> <a href="#ordering-term">ordering-term</a> <a href="#over-clause">over-clause</a> <a href="#result-column">result-column</a> <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a> <a href="#simple-function-invocation">simple-function-invocation</a> <a href="#simple-select-stmt">simple-select-stmt</a> <a href="#table-constraint">table-constraint</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#update-stmt">update-stmt</a> <a href="#update-stmt-limited">update-stmt-limited</a> <a href="#upsert-clause">upsert-clause</a> <a href="#window-defn">window-defn</a> <a href="#window-function-invocation">window-function-invocation</a><br></br> References: <a href="#filter-clause">filter-clause</a> <a href="#literal-value">literal-value</a> <a href="#over-clause">over-clause</a> <a href="#raise-function">raise-function</a> <a href="#select-stmt">select-stmt</a> <a href="#type-name">type-name</a><br></br> | | | | | | 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | See also: <a href="lang_dropview.html">lang_dropview.html</a> </div> <a name="expr"></a><h4>expr:</h4><div class='imgcontainer'> <img src="images/syntax/expr.gif"></img><br></br> Used by: <a href="#aggregate-function-invocation">aggregate-function-invocation</a> <a href="#attach-stmt">attach-stmt</a> <a href="#column-constraint">column-constraint</a> <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#create-index-stmt">create-index-stmt</a> <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#delete-stmt">delete-stmt</a> <a href="#delete-stmt-limited">delete-stmt-limited</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#filter-clause">filter-clause</a> <a href="#frame-spec">frame-spec</a> <a href="#indexed-column">indexed-column</a> <a href="#insert-stmt">insert-stmt</a> <a href="#join-constraint">join-constraint</a> <a href="#ordering-term">ordering-term</a> <a href="#over-clause">over-clause</a> <a href="#result-column">result-column</a> <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a> <a href="#simple-function-invocation">simple-function-invocation</a> <a href="#simple-select-stmt">simple-select-stmt</a> <a href="#table-constraint">table-constraint</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#update-stmt">update-stmt</a> <a href="#update-stmt-limited">update-stmt-limited</a> <a href="#upsert-clause">upsert-clause</a> <a href="#window-defn">window-defn</a> <a href="#window-function-invocation">window-function-invocation</a><br></br> References: <a href="#filter-clause">filter-clause</a> <a href="#literal-value">literal-value</a> <a href="#over-clause">over-clause</a> <a href="#raise-function">raise-function</a> <a href="#select-stmt">select-stmt</a> <a href="#type-name">type-name</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="raise-function"></a><h4>raise-function:</h4><div class='imgcontainer'> <img src="images/syntax/raise-function.gif"></img><br></br> Used by: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createtrigger.html#raise">lang_createtrigger.html#raise</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="literal-value"></a><h4>literal-value:</h4><div class='imgcontainer'> <img src="images/syntax/literal-value.gif"></img><br></br> Used by: <a href="#column-constraint">column-constraint</a> <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="numeric-literal"></a><h4>numeric-literal:</h4><div class='imgcontainer'> <img src="images/syntax/numeric-literal.gif"></img><br></br><br></br> See also: <a href="lang_expr.html#litvalue">lang_expr.html#litvalue</a> </div> <a name="insert-stmt"></a><h4>insert-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/insert-stmt.gif"></img><br></br> Used by: <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#expr">expr</a> <a href="#select-stmt">select-stmt</a> <a href="#upsert-clause">upsert-clause</a> <a href="#with-clause">with-clause</a><br></br> See also: <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_insert.html">lang_insert.html</a> </div> <a name="upsert-clause"></a><h4>upsert-clause:</h4><div class='imgcontainer'> <img src="images/syntax/upsert-clause.gif"></img><br></br> Used by: <a href="#insert-stmt">insert-stmt</a><br></br> References: <a href="#column-name-list">column-name-list</a> <a href="#expr">expr</a> <a href="#indexed-column">indexed-column</a><br></br> See also: <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_upsert.html">lang_upsert.html</a> </div> <a name="pragma-stmt"></a><h4>pragma-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/pragma-stmt.gif"></img><br></br> Used by: <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#pragma-value">pragma-value</a><br></br> See also: <a href="pragma.html#syntax">pragma.html#syntax</a> |
374 375 376 377 378 379 380 | See also: <a href="lang_reindex.html">lang_reindex.html</a> </div> <a name="select-stmt"></a><h4>select-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/select-stmt.gif"></img><br></br> Used by: <a href="#common-table-expression">common-table-expression</a> <a href="#create-table-stmt">create-table-stmt</a> <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#create-view-stmt">create-view-stmt</a> <a href="#expr">expr</a> <a href="#insert-stmt">insert-stmt</a> <a href="#sql-stmt">sql-stmt</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#with-clause">with-clause</a><br></br> References: <a href="#common-table-expression">common-table-expression</a> <a href="#compound-operator">compound-operator</a> <a href="#expr">expr</a> <a href="#join-clause">join-clause</a> <a href="#ordering-term">ordering-term</a> <a href="#result-column">result-column</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#window-defn">window-defn</a><br></br> | | | | 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 | See also: <a href="lang_reindex.html">lang_reindex.html</a> </div> <a name="select-stmt"></a><h4>select-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/select-stmt.gif"></img><br></br> Used by: <a href="#common-table-expression">common-table-expression</a> <a href="#create-table-stmt">create-table-stmt</a> <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#create-view-stmt">create-view-stmt</a> <a href="#expr">expr</a> <a href="#insert-stmt">insert-stmt</a> <a href="#sql-stmt">sql-stmt</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#with-clause">with-clause</a><br></br> References: <a href="#common-table-expression">common-table-expression</a> <a href="#compound-operator">compound-operator</a> <a href="#expr">expr</a> <a href="#join-clause">join-clause</a> <a href="#ordering-term">ordering-term</a> <a href="#result-column">result-column</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#window-defn">window-defn</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="lang_with.html#recursivecte">lang_with.html#recursivecte</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="join-clause"></a><h4>join-clause:</h4><div class='imgcontainer'> <img src="images/syntax/join-clause.gif"></img><br></br> Used by: <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a> <a href="#table-or-subquery">table-or-subquery</a><br></br> References: <a href="#join-constraint">join-constraint</a> <a href="#join-operator">join-operator</a> <a href="#table-or-subquery">table-or-subquery</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="select-core"></a><h4>select-core:</h4><div class='imgcontainer'> <img src="images/syntax/select-core.gif"></img><br></br> Used by: <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#simple-select-stmt">simple-select-stmt</a><br></br> References: <a href="#expr">expr</a> <a href="#join-clause">join-clause</a> <a href="#result-column">result-column</a> <a href="#table-or-subquery">table-or-subquery</a> <a href="#window-defn">window-defn</a><br></br> See also: <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> |
413 414 415 416 417 418 419 | See also: <a href="lang_select.html#compound">lang_select.html#compound</a> </div> <a name="table-or-subquery"></a><h4>table-or-subquery:</h4><div class='imgcontainer'> <img src="images/syntax/table-or-subquery.gif"></img><br></br> Used by: <a href="#join-clause">join-clause</a> <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a><br></br> References: <a href="#expr">expr</a> <a href="#join-clause">join-clause</a> <a href="#select-stmt">select-stmt</a><br></br> | | | | | | | | | 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 | See also: <a href="lang_select.html#compound">lang_select.html#compound</a> </div> <a name="table-or-subquery"></a><h4>table-or-subquery:</h4><div class='imgcontainer'> <img src="images/syntax/table-or-subquery.gif"></img><br></br> Used by: <a href="#join-clause">join-clause</a> <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a><br></br> References: <a href="#expr">expr</a> <a href="#join-clause">join-clause</a> <a href="#select-stmt">select-stmt</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="result-column"></a><h4>result-column:</h4><div class='imgcontainer'> <img src="images/syntax/result-column.gif"></img><br></br> Used by: <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="join-operator"></a><h4>join-operator:</h4><div class='imgcontainer'> <img src="images/syntax/join-operator.gif"></img><br></br> Used by: <a href="#join-clause">join-clause</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#fromclause">lang_select.html#fromclause</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="join-constraint"></a><h4>join-constraint:</h4><div class='imgcontainer'> <img src="images/syntax/join-constraint.gif"></img><br></br> Used by: <a href="#join-clause">join-clause</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#fromclause">lang_select.html#fromclause</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="ordering-term"></a><h4>ordering-term:</h4><div class='imgcontainer'> <img src="images/syntax/ordering-term.gif"></img><br></br> Used by: <a href="#compound-select-stmt">compound-select-stmt</a> <a href="#delete-stmt-limited">delete-stmt-limited</a> <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#over-clause">over-clause</a> <a href="#select-stmt">select-stmt</a> <a href="#simple-select-stmt">simple-select-stmt</a> <a href="#update-stmt-limited">update-stmt-limited</a> <a href="#window-defn">window-defn</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="compound-operator"></a><h4>compound-operator:</h4><div class='imgcontainer'> <img src="images/syntax/compound-operator.gif"></img><br></br> Used by: <a href="#factored-select-stmt">factored-select-stmt</a> <a href="#select-stmt">select-stmt</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="lang_with.html#recursivecte">lang_with.html#recursivecte</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="update-stmt"></a><h4>update-stmt:</h4><div class='imgcontainer'> <img src="images/syntax/update-stmt.gif"></img><br></br> Used by: <a href="#create-trigger-stmt">create-trigger-stmt</a> <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#column-name-list">column-name-list</a> <a href="#expr">expr</a> <a href="#qualified-table-name">qualified-table-name</a> <a href="#with-clause">with-clause</a><br></br> See also: <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_update.html">lang_update.html</a> </div> <a name="column-name-list"></a><h4>column-name-list:</h4><div class='imgcontainer'> <img src="images/syntax/column-name-list.gif"></img><br></br> Used by: <a href="#update-stmt">update-stmt</a> <a href="#update-stmt-limited">update-stmt-limited</a> <a href="#upsert-clause">upsert-clause</a><br></br> See also: <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> </div> <a name="update-stmt-limited"></a><h4>update-stmt-limited:</h4><div class='imgcontainer'> <img src="images/syntax/update-stmt-limited.gif"></img><br></br> Used by: <a href="#sql-stmt">sql-stmt</a><br></br> References: <a href="#column-name-list">column-name-list</a> <a href="#expr">expr</a> <a href="#ordering-term">ordering-term</a> <a href="#qualified-table-name">qualified-table-name</a> <a href="#with-clause">with-clause</a><br></br> See also: <a href="lang_update.html">lang_update.html</a> |
490 491 492 493 494 495 496 | See also: <a href="lang_comment.html">lang_comment.html</a> </div> <a name="filter-clause"></a><h4>filter-clause:</h4><div class='imgcontainer'> <img src="images/syntax/filter-clause.gif"></img><br></br> Used by: <a href="#aggregate-function-invocation">aggregate-function-invocation</a> <a href="#expr">expr</a> <a href="#window-function-invocation">window-function-invocation</a><br></br> References: <a href="#expr">expr</a><br></br> | | | | | | 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 | See also: <a href="lang_comment.html">lang_comment.html</a> </div> <a name="filter-clause"></a><h4>filter-clause:</h4><div class='imgcontainer'> <img src="images/syntax/filter-clause.gif"></img><br></br> Used by: <a href="#aggregate-function-invocation">aggregate-function-invocation</a> <a href="#expr">expr</a> <a href="#window-function-invocation">window-function-invocation</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="window-defn"></a><h4>window-defn:</h4><div class='imgcontainer'> <img src="images/syntax/window-defn.gif"></img><br></br> Used by: <a href="#select-core">select-core</a> <a href="#select-stmt">select-stmt</a> <a href="#window-function-invocation">window-function-invocation</a><br></br> References: <a href="#expr">expr</a> <a href="#frame-spec">frame-spec</a> <a href="#ordering-term">ordering-term</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="over-clause"></a><h4>over-clause:</h4><div class='imgcontainer'> <img src="images/syntax/over-clause.gif"></img><br></br> Used by: <a href="#expr">expr</a><br></br> References: <a href="#expr">expr</a> <a href="#frame-spec">frame-spec</a> <a href="#ordering-term">ordering-term</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="frame-spec"></a><h4>frame-spec:</h4><div class='imgcontainer'> <img src="images/syntax/frame-spec.gif"></img><br></br> Used by: <a href="#over-clause">over-clause</a> <a href="#window-defn">window-defn</a><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_aggfunc.html">lang_aggfunc.html</a> <a href="lang_altertable.html">lang_altertable.html</a> <a href="lang_attach.html">lang_attach.html</a> <a href="lang_createindex.html">lang_createindex.html</a> <a href="lang_createtable.html">lang_createtable.html</a> <a href="lang_createtrigger.html">lang_createtrigger.html</a> <a href="lang_createview.html">lang_createview.html</a> <a href="lang_delete.html">lang_delete.html</a> <a href="lang_expr.html">lang_expr.html</a> <a href="lang_insert.html">lang_insert.html</a> <a href="lang_select.html">lang_select.html</a> <a href="lang_select.html#compound">lang_select.html#compound</a> <a href="lang_select.html#simpleselect">lang_select.html#simpleselect</a> <a href="lang_update.html">lang_update.html</a> <a href="lang_upsert.html">lang_upsert.html</a> <a href="lang_with.html">lang_with.html</a> <a href="partialindex.html">partialindex.html</a> </div> <a name="simple-function-invocation"></a><h4>simple-function-invocation:</h4><div class='imgcontainer'> <img src="images/syntax/simple-function-invocation.gif"></img><br></br><br></br> References: <a href="#expr">expr</a><br></br> See also: <a href="lang_expr.html#booleanexpr">lang_expr.html#booleanexpr</a> </div> |
Changes to Doc/Special/Core/vtab.html.
69 70 71 72 73 74 75 | }, 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. */ | | | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }, 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' ){ |
1355 1356 1357 1358 1359 1360 1361 | the implementation must set *pRowid to the rowid of the newly inserted row; this will become the value returned by the <a href="c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a> function. Setting this value in all the other cases is a harmless no-op; the SQLite engine ignores the *pRowid return value if argc==1 or argv[1] is not an SQL NULL. </p><p>Each call to xUpdate will fall into one of cases shown below. | | | 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 | the implementation must set *pRowid to the rowid of the newly inserted row; this will become the value returned by the <a href="c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a> function. Setting this value in all the other cases is a harmless no-op; the SQLite engine ignores the *pRowid return value if argc==1 or argv[1] is not an SQL NULL. </p><p>Each call to xUpdate will fall into one of cases shown below. Not that references to <b>argv[i]</b> mean the SQL value held within the argv[i] object, not the argv[i] object itself. </p><blockquote> <dl> <dt><b>argc = 1 <br> argv[0] ≠ NULL</b> </dt><dd><p> |
Changes to Externals/Eagle/lib/Eagle1.0/vendor.eagle.
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 | # NOTE: Check if the HTTPS security protocols need to be adjusted for # use with the test suite and/or build tools. # checkForSecurityProtocols stdout \ [checkForVendorQuiet checkForSecurityProtocols] } # # HACK: When using [compileCSharp] on .NET Core 3.0, it will produce # compiler warnings complaining about mismatched versions of the # .NET Standard reference assemblies, e.g. 2.0 versus 2.1; Since # the test suite considers these warnings to be an indication of # test failure, we disable them here. # if {![info exists no(disableWarning1701)] && [isDotNetCore]} then { | > > > > > > > > > > > > > > > > > > | | 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 | # NOTE: Check if the HTTPS security protocols need to be adjusted for # use with the test suite and/or build tools. # checkForSecurityProtocols stdout \ [checkForVendorQuiet checkForSecurityProtocols] } # # HACK: When the Eagle core test suite infrastructure is beta 45 or # lower, override the list of "known" Mono runtime versions. # Eventually, this override should be removed (i.e. once the # Eagle core library included in "Externals" is updated). # if {[package vcompare \ $eagle_platform(patchLevel) 1.0.7213.50727] <= 0} then { set test_well_known(monoVersions) [list \ [list 2 0] [list 2 2] [list 2 4] [list 2 6] [list 2 8] \ [list 2 10] [list 2 11] [list 3 0] [list 3 1] [list 3 2] \ [list 3 4] [list 3 6] [list 3 8] [list 3 10] [list 3 12] \ [list 4 0] [list 4 2] [list 4 4] [list 4 6] [list 4 8] \ [list 5 0] [list 5 2] [list 5 4] [list 5 8] [list 5 10] \ [list 5 12] [list 5 14] [list 5 16] [list 5 18] [list 5 20] \ [list 6 0] [list 6 4] [list 6 6] [list 6 8] [list 6 10]] } # # HACK: When using [compileCSharp] on .NET Core 3.0, it will produce # compiler warnings complaining about mismatched versions of the # .NET Standard reference assemblies, e.g. 2.0 versus 2.1; Since # the test suite considers these warnings to be an indication of # test failure, we disable them here. # if {![info exists no(disableWarning1701)] && [isDotNetCore]} then { lappend eagle_platform(csharpOptions) nowarn:1701 } # # HACK: Prevent the Eagle core test suite infrastructure from checking # test constraints that are time-consuming and/or most likely to # be superfluous to third-party test suites (i.e. those that are # not testing the Eagle core library itself). |
Changes to SQLite.Interop/props/sqlite3.props.
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8"?> <!-- * * sqlite3.props - * * Written by Joe Mistachkin. * Released to the public domain, use at your own risk! * --> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup Label="UserMacros"> | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <!-- * * sqlite3.props - * * Written by Joe Mistachkin. * Released to the public domain, use at your own risk! * --> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup Label="UserMacros"> <SQLITE_MANIFEST_VERSION>3.32.0.0</SQLITE_MANIFEST_VERSION> <SQLITE_RC_VERSION>3,32,0,0</SQLITE_RC_VERSION> <SQLITE_COMMON_DEFINES>_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1;SQLITE_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=1</SQLITE_COMMON_DEFINES> <SQLITE_EXTRA_DEFINES>SQLITE_PLACEHOLDER=1</SQLITE_EXTRA_DEFINES> <SQLITE_WINCE_200X_DEFINES>SQLITE_OMIT_WAL=1</SQLITE_WINCE_200X_DEFINES> <SQLITE_WINCE_2013_DEFINES>HAVE_ERRNO_H=1;SQLITE_MSVC_LOCALTIME_API=1</SQLITE_WINCE_2013_DEFINES> <SQLITE_DEBUG_DEFINES>SQLITE_DEBUG=1;SQLITE_MEMDEBUG=1;SQLITE_ENABLE_EXPENSIVE_ASSERT=1</SQLITE_DEBUG_DEFINES> <SQLITE_RELEASE_DEFINES>SQLITE_WIN32_MALLOC=1</SQLITE_RELEASE_DEFINES> <SQLITE_DISABLE_WARNINGS>4055;4100;4127;4146;4210;4232;4244;4245;4267;4306;4389;4701;4703;4706</SQLITE_DISABLE_WARNINGS> <SQLITE_DISABLE_X64_WARNINGS></SQLITE_DISABLE_X64_WARNINGS> </PropertyGroup> |
Changes to SQLite.Interop/props/sqlite3.vsprops.
10 11 12 13 14 15 16 | <VisualStudioPropertySheet ProjectType="Visual C++" Version="8.00" Name="sqlite3" > <UserMacro Name="SQLITE_MANIFEST_VERSION" | | | | | 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 | <VisualStudioPropertySheet ProjectType="Visual C++" Version="8.00" Name="sqlite3" > <UserMacro Name="SQLITE_MANIFEST_VERSION" Value="3.32.0.0" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_RC_VERSION" Value="3,32,0,0" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_COMMON_DEFINES" Value="_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1;SQLITE_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=1" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_EXTRA_DEFINES" Value="SQLITE_PLACEHOLDER=1" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_WINCE_200X_DEFINES" Value="SQLITE_OMIT_WAL=1" PerformEnvironmentSet="true" /> |
Changes to SQLite.Interop/src/core/sqlite3.c.
1 2 | /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite | | | 1 2 3 4 5 6 7 8 9 10 | /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite ** version 3.32.0. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements ** of 5% or more are commonly seen when SQLite is compiled as a single ** translation unit. ** ** This file is all you need to compile SQLite. To use SQLite in other |
214 215 216 217 218 219 220 221 222 223 224 225 226 227 | #endif #if SQLITE_ENABLE_ATOMIC_WRITE "ENABLE_ATOMIC_WRITE", #endif #if SQLITE_ENABLE_BATCH_ATOMIC_WRITE "ENABLE_BATCH_ATOMIC_WRITE", #endif #if SQLITE_ENABLE_CEROD "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif #if SQLITE_ENABLE_COLUMN_METADATA "ENABLE_COLUMN_METADATA", #endif #if SQLITE_ENABLE_COLUMN_USED_MASK | > > > | 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | #endif #if SQLITE_ENABLE_ATOMIC_WRITE "ENABLE_ATOMIC_WRITE", #endif #if SQLITE_ENABLE_BATCH_ATOMIC_WRITE "ENABLE_BATCH_ATOMIC_WRITE", #endif #if SQLITE_ENABLE_BYTECODE_VTAB "ENABLE_BYTECODE_VTAB", #endif #if SQLITE_ENABLE_CEROD "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif #if SQLITE_ENABLE_COLUMN_METADATA "ENABLE_COLUMN_METADATA", #endif #if SQLITE_ENABLE_COLUMN_USED_MASK |
376 377 378 379 380 381 382 | #endif #if SQLITE_FTS5_ENABLE_TEST_MI "FTS5_ENABLE_TEST_MI", #endif #if SQLITE_FTS5_NO_WITHOUT_ROWID "FTS5_NO_WITHOUT_ROWID", #endif | < < < | 379 380 381 382 383 384 385 386 387 388 389 390 391 392 | #endif #if SQLITE_FTS5_ENABLE_TEST_MI "FTS5_ENABLE_TEST_MI", #endif #if SQLITE_FTS5_NO_WITHOUT_ROWID "FTS5_NO_WITHOUT_ROWID", #endif #if HAVE_ISNAN || SQLITE_HAVE_ISNAN "HAVE_ISNAN", #endif #if SQLITE_HOMEGROWN_RECURSIVE_MUTEX "HOMEGROWN_RECURSIVE_MUTEX", #endif #if SQLITE_IGNORE_AFP_LOCK_ERRORS |
535 536 537 538 539 540 541 | #endif #if SQLITE_OMIT_BETWEEN_OPTIMIZATION "OMIT_BETWEEN_OPTIMIZATION", #endif #if SQLITE_OMIT_BLOB_LITERAL "OMIT_BLOB_LITERAL", #endif | < < < | 535 536 537 538 539 540 541 542 543 544 545 546 547 548 | #endif #if SQLITE_OMIT_BETWEEN_OPTIMIZATION "OMIT_BETWEEN_OPTIMIZATION", #endif #if SQLITE_OMIT_BLOB_LITERAL "OMIT_BLOB_LITERAL", #endif #if SQLITE_OMIT_CAST "OMIT_CAST", #endif #if SQLITE_OMIT_CHECK "OMIT_CHECK", #endif #if SQLITE_OMIT_COMPLETE |
1161 1162 1163 1164 1165 1166 1167 | ** been edited in any way since it was last checked in, then the last ** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ | | | | | 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 | ** been edited in any way since it was last checked in, then the last ** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.32.0" #define SQLITE_VERSION_NUMBER 3032000 #define SQLITE_SOURCE_ID "2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a" /* ** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros |
1337 1338 1339 1340 1341 1342 1343 1344 | ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. ** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if ** the [sqlite3] object is successfully destroyed and all associated ** resources are deallocated. ** ** ^If the database connection is associated with unfinalized prepared | > > > > | | | | > > | | | | | < < < < < < < < < < | 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 | ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. ** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if ** the [sqlite3] object is successfully destroyed and all associated ** resources are deallocated. ** ** Ideally, applications should [sqlite3_finalize | finalize] all ** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and ** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated ** with the [sqlite3] object prior to attempting to close the object. ** ^If the database connection is associated with unfinalized prepared ** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then ** sqlite3_close() will leave the database connection open and return ** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared ** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups, ** it returns [SQLITE_OK] regardless, but instead of deallocating the database ** connection immediately, it marks the database connection as an unusable ** "zombie" and makes arrangements to automatically deallocate the database ** connection after all prepared statements are finalized, all BLOB handles ** are closed, and all backups have finished. The sqlite3_close_v2() interface ** is intended for use with host languages that are garbage collected, and ** where the order in which destructors are called is arbitrary. ** ** ^If an [sqlite3] object is destroyed while a transaction is open, ** the transaction is automatically rolled back. ** ** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] ** must be either a NULL ** pointer or an [sqlite3] object pointer obtained |
1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 | #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) #define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) #define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) #define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) #define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) #define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) | > > > | 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 | #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) #define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) #define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) #define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) #define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) #define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) |
2125 2126 2127 2128 2129 2130 2131 | ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. ** ^This file control takes the file descriptor out of batch write mode ** so that all subsequent write operations are independent. ** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without ** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. ** ** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] | | > | < | > > > > > > > | 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 | ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. ** ^This file control takes the file descriptor out of batch write mode ** so that all subsequent write operations are independent. ** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without ** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. ** ** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] ** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode is used to configure a VFS ** to block for up to M milliseconds before failing when attempting to ** obtain a file lock using the xLock or xShmLock methods of the VFS. ** The parameter is a pointer to a 32-bit signed integer that contains ** the value that M is to be set to. Before returning, the 32-bit signed ** integer is overwritten with the previous value of M. ** ** <li>[[SQLITE_FCNTL_DATA_VERSION]] ** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to ** a database file. The argument is a pointer to a 32-bit unsigned integer. ** The "data version" for the pager is written into the pointer. The ** "data version" changes whenever any change occurs to the corresponding ** database file, either through SQL statements on the same database ** connection or through transactions committed by separate database ** connections possibly in other processes. The [sqlite3_total_changes()] ** interface can be used to find if any database on the connection has changed, ** but that interface responds to changes on TEMP as well as MAIN and does ** not provide a mechanism to detect changes to MAIN only. Also, the ** [sqlite3_total_changes()] interface responds to internal changes only and ** omits changes made by other database connections. The ** [PRAGMA data_version] command provides a mechanism to detect changes to ** a single attached database that occur due to other database connections, ** but omits changes implemented by the database connection on which it is ** called. This file control is the only mechanism to detect changes that ** happen either internally or externally and that are associated with ** a particular attached database. ** ** <li>[[SQLITE_FCNTL_CKPT_START]] ** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint ** in wal mode before the client starts to copy pages from the wal ** file to the database file. ** ** <li>[[SQLITE_FCNTL_CKPT_DONE]] ** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint ** in wal mode after the client has finished copying pages from the wal ** file to the database file, but before the *-shm file is updated to ** record the fact that the pages have been checkpointed. ** </ul> |
2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 | #define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 #define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE #define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE #define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO | > > | 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 | #define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 #define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 #define SQLITE_FCNTL_RESERVE_BYTES 38 #define SQLITE_FCNTL_CKPT_START 39 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE #define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE #define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO |
4571 4572 4573 4574 4575 4576 4577 | /* ** CAPI3REF: Obtain Values For URI Parameters ** ** These are utility routines, useful to [VFS|custom VFS implementations], ** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** | > > > > | | > > > > > > > | 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 | /* ** CAPI3REF: Obtain Values For URI Parameters ** ** These are utility routines, useful to [VFS|custom VFS implementations], ** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** ** The first parameter to these interfaces (hereafter referred to ** as F) must be one of: ** <ul> ** <li> A database filename pointer created by the SQLite core and ** passed into the xOpen() method of a VFS implemention, or ** <li> A filename obtained from [sqlite3_db_filename()], or ** <li> A new filename constructed using [sqlite3_create_filename()]. ** </ul> ** If the F parameter is not one of the above, then the behavior is ** undefined and probably undesirable. Older versions of SQLite were ** more tolerant of invalid F parameters than newer versions. ** ** If F is a suitable filename (as described in the previous paragraph) ** and if P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P ** parameter if it exists or a NULL pointer if P does not appear as a ** query parameter on F. If P is a query parameter of F and it ** has no explicit value, then sqlite3_uri_parameter(F,P) returns ** a pointer to an empty string. ** |
4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 | ** return value from [sqlite3_db_filename()], then the result is ** undefined and is likely a memory access violation. */ SQLITE_API const char *sqlite3_filename_database(const char*); SQLITE_API const char *sqlite3_filename_journal(const char*); SQLITE_API const char *sqlite3_filename_wal(const char*); /* ** CAPI3REF: Error Codes And Messages ** METHOD: sqlite3 ** ** ^If the most recent sqlite3_* API call associated with ** [database connection] D failed, then the sqlite3_errcode(D) interface | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 | ** return value from [sqlite3_db_filename()], then the result is ** undefined and is likely a memory access violation. */ SQLITE_API const char *sqlite3_filename_database(const char*); SQLITE_API const char *sqlite3_filename_journal(const char*); SQLITE_API const char *sqlite3_filename_wal(const char*); /* ** CAPI3REF: Database File Corresponding To A Journal ** ** ^If X is the name of a rollback or WAL-mode journal file that is ** passed into the xOpen method of [sqlite3_vfs], then ** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file] ** object that represents the main database file. ** ** This routine is intended for use in custom [VFS] implementations ** only. It is not a general-purpose interface. ** The argument sqlite3_file_object(X) must be a filename pointer that ** has been passed into [sqlite3_vfs].xOpen method where the ** flags parameter to xOpen contains one of the bits ** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use ** of this routine results in undefined and probably undesirable ** behavior. */ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); /* ** CAPI3REF: Create and Destroy VFS Filenames ** ** These interfces are provided for use by [VFS shim] implementations and ** are not useful outside of that context. ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of ** database filename D with corresponding journal file J and WAL file W and ** with N URI parameters key/values pairs in the array P. The result from ** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that ** is safe to pass to routines like: ** <ul> ** <li> [sqlite3_uri_parameter()], ** <li> [sqlite3_uri_boolean()], ** <li> [sqlite3_uri_int64()], ** <li> [sqlite3_uri_key()], ** <li> [sqlite3_filename_database()], ** <li> [sqlite3_filename_journal()], or ** <li> [sqlite3_filename_wal()]. ** </ul> ** If a memory allocation error occurs, sqlite3_create_filename() might ** return a NULL pointer. The memory obtained from sqlite3_create_filename(X) ** must be released by a corresponding call to sqlite3_free_filename(Y). ** ** The P parameter in sqlite3_create_filename(D,J,W,N,P) should be an array ** of 2*N pointers to strings. Each pair of pointers in this array corresponds ** to a key and value for a query parameter. The P parameter may be a NULL ** pointer if N is zero. None of the 2*N pointers in the P array may be ** NULL pointers and key pointers should not be empty strings. ** None of the D, J, or W parameters to sqlite3_create_filename(D,J,W,N,P) may ** be NULL pointers, though they can be empty strings. ** ** The sqlite3_free_filename(Y) routine releases a memory allocation ** previously obtained from sqlite3_create_filename(). Invoking ** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op. ** ** If the Y parameter to sqlite3_free_filename(Y) is anything other ** than a NULL pointer or a pointer previously acquired from ** sqlite3_create_filename(), then bad things such as heap ** corruption or segfaults may occur. The value Y should be ** used again after sqlite3_free_filename(Y) has been called. This means ** that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y, ** then the corresponding [sqlite3_module.xClose() method should also be ** invoked prior to calling sqlite3_free_filename(Y). */ SQLITE_API char *sqlite3_create_filename( const char *zDatabase, const char *zJournal, const char *zWal, int nParam, const char **azParam ); SQLITE_API void sqlite3_free_filename(char*); /* ** CAPI3REF: Error Codes And Messages ** METHOD: sqlite3 ** ** ^If the most recent sqlite3_* API call associated with ** [database connection] D failed, then the sqlite3_errcode(D) interface |
5237 5238 5239 5240 5241 5242 5243 | ** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. ** ^The index for named parameters can be looked up using the ** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. ** ^The NNN value must be between 1 and the [sqlite3_limit()] | | > > > > > > > > > > > > > > > > > > | | 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 | ** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. ** ^The index for named parameters can be looked up using the ** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. ** ^The NNN value must be between 1 and the [sqlite3_limit()] ** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 32766). ** ** ^The third argument is the value to bind to the parameter. ** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() ** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter ** is ignored and the end result is the same as sqlite3_bind_null(). ** ^If the third parameter to sqlite3_bind_text() is not NULL, then ** it should be a pointer to well-formed UTF8 text. ** ^If the third parameter to sqlite3_bind_text16() is not NULL, then ** it should be a pointer to well-formed UTF16 text. ** ^If the third parameter to sqlite3_bind_text64() is not NULL, then ** it should be a pointer to a well-formed unicode string that is ** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16 ** otherwise. ** ** [[byte-order determination rules]] ^The byte-order of ** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) ** found in first character, which is removed, or in the absence of a BOM ** the byte order is the native byte order of the host ** machine for sqlite3_bind_text16() or the byte order specified in ** the 6th parameter for sqlite3_bind_text64().)^ ** ^If UTF16 input text contains invalid unicode ** characters, then SQLite might change those invalid characters ** into the unicode replacement character: U+FFFD. ** ** ^(In those routines that have a fourth argument, its value is the ** number of bytes in the parameter. To be clear: the value is the ** number of <u>bytes</u> in the value, not the number of characters.)^ ** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() ** is negative, then the length of the string is ** the number of bytes up to the first zero terminator. ** If the fourth parameter to sqlite3_bind_blob() is negative, then ** the behavior is undefined. ** If a non-negative fourth parameter is provided to sqlite3_bind_text() ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL ** terminated. If any NUL characters occurs at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. ** ** ^The fifth argument to the BLOB and string binding interfaces ** is a destructor used to dispose of the BLOB or ** string after SQLite has finished with it. ^The destructor is called |
6424 6425 6426 6427 6428 6429 6430 | ** ** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer ** when first called if N is less than or equal to zero or if a memory ** allocate error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the | | | 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 | ** ** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer ** when first called if N is less than or equal to zero or if a memory ** allocate error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the ** value of N in any subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no ** pointless memory allocations occur. ** ** ^SQLite automatically frees the memory allocated by ** sqlite3_aggregate_context() when the aggregate query concludes. |
6581 6582 6583 6584 6585 6586 6587 | ** ** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. ** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() ** as the text of an error message. ^SQLite interprets the error ** message string from sqlite3_result_error() as UTF-8. ^SQLite | | > | | 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 | ** ** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. ** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() ** as the text of an error message. ^SQLite interprets the error ** message string from sqlite3_result_error() as UTF-8. ^SQLite ** interprets the string from sqlite3_result_error16() as UTF-16 using ** the same [byte-order determination rules] as [sqlite3_bind_text16()]. ** ^If the third parameter to sqlite3_result_error() ** or sqlite3_result_error16() is negative then SQLite takes as the error ** message all text up through the first zero character. ** ^If the third parameter to sqlite3_result_error() or ** sqlite3_result_error16() is non-negative then SQLite takes that many ** bytes (not characters) from the 2nd parameter as the error message. ** ^The sqlite3_result_error() and sqlite3_result_error16() ** routines make a private copy of the error message text before |
6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 | ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. | > > > > > > > > > > > > > > > > > > > | 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 | ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and ** sqlite3_result_text16be() routines, and for sqlite3_result_text64() ** when the encoding is not UTF8, if the input UTF16 begins with a ** byte-order mark (BOM, U+FEFF) then the BOM is removed from the ** string and the rest of the string is interpreted according to the ** byte-order specified by the BOM. ^The byte-order specified by ** the BOM at the beginning of the text overrides the byte-order ** specified by the interface procedure. ^So, for example, if ** sqlite3_result_text16le() is invoked with text that begins ** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the ** first two bytes of input are skipped and the remaining input ** is interpreted as UTF16BE text. ** ** ^For UTF16 input text to the sqlite3_result_text16(), ** sqlite3_result_text16be(), sqlite3_result_text16le(), and ** sqlite3_result_text64() routines, if the text contains invalid ** UTF16 characters, the invalid characters might be converted ** into the unicode replacement character, U+FFFD. ** ** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. |
6855 6856 6857 6858 6859 6860 6861 | ); SQLITE_API int sqlite3_collation_needed16( sqlite3*, void*, void(*)(void*,sqlite3*,int eTextRep,const void*) ); | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 | ); SQLITE_API int sqlite3_collation_needed16( sqlite3*, void*, void(*)(void*,sqlite3*,int eTextRep,const void*) ); #ifdef SQLITE_ENABLE_CEROD /* ** Specify the activation key for a CEROD database. Unless ** activated, none of the CEROD routines will work. */ SQLITE_API void sqlite3_activate_cerod( const char *zPassPhrase /* Activation phrase */ |
8642 8643 8644 8645 8646 8647 8648 | #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 #define SQLITE_TESTCTRL_PENDING_BYTE 11 #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 | | | 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 | #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 #define SQLITE_TESTCTRL_PENDING_BYTE 11 #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 |
13268 13269 13270 13271 13272 13273 13274 13275 13276 | #ifndef SQLITE_MAX_ATTACHED # define SQLITE_MAX_ATTACHED 10 #endif /* ** The maximum value of a ?nnn wildcard that the parser will accept. */ #ifndef SQLITE_MAX_VARIABLE_NUMBER | > > > | | 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 | #ifndef SQLITE_MAX_ATTACHED # define SQLITE_MAX_ATTACHED 10 #endif /* ** The maximum value of a ?nnn wildcard that the parser will accept. ** If the value exceeds 32767 then extra space is required for the Expr ** structure. But otherwise, we believe that the number can be as large ** as a signed 32-bit integer can hold. */ #ifndef SQLITE_MAX_VARIABLE_NUMBER # define SQLITE_MAX_VARIABLE_NUMBER 32766 #endif /* Maximum page size. The upper bound on this value is 65536. This a limit ** imposed by the use of 16-bit offsets within each page. ** ** Earlier versions of SQLite allowed the user to change this value at ** compile time. This is no longer permitted, on the grounds that it creates |
13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 | #pragma warn -rch /* unreachable code */ #pragma warn -ccc /* Condition is always true or false */ #pragma warn -aus /* Assigned value is never used */ #pragma warn -csu /* Comparing signed and unsigned */ #pragma warn -spa /* Suspicious pointer arithmetic */ #endif /* ** Include standard header files as necessary */ #ifdef HAVE_STDINT_H #include <stdint.h> #endif #ifdef HAVE_INTTYPES_H | > > > > > > > > > > > > > > > | 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 | #pragma warn -rch /* unreachable code */ #pragma warn -ccc /* Condition is always true or false */ #pragma warn -aus /* Assigned value is never used */ #pragma warn -csu /* Comparing signed and unsigned */ #pragma warn -spa /* Suspicious pointer arithmetic */ #endif /* ** WAL mode depends on atomic aligned 32-bit loads and stores in a few ** places. The following macros try to make this explicit. */ #ifndef __has_feature # define __has_feature(x) 0 /* compatibility with non-clang compilers */ #endif #if GCC_VERSION>=4007000 || __has_feature(c_atomic) # define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) # define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) #else # define AtomicLoad(PTR) (*(PTR)) # define AtomicStore(PTR,VAL) (*(PTR) = (VAL)) #endif /* ** Include standard header files as necessary */ #ifdef HAVE_STDINT_H #include <stdint.h> #endif #ifdef HAVE_INTTYPES_H |
14436 14437 14438 14439 14440 14441 14442 | ** callback is currently invoked only from within pager.c. */ typedef struct BusyHandler BusyHandler; struct BusyHandler { int (*xBusyHandler)(void *,int); /* The busy callback */ void *pBusyArg; /* First arg to busy callback */ int nBusy; /* Incremented with each busy call */ | < | 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 | ** callback is currently invoked only from within pager.c. */ typedef struct BusyHandler BusyHandler; struct BusyHandler { int (*xBusyHandler)(void *,int); /* The busy callback */ void *pBusyArg; /* First arg to busy callback */ int nBusy; /* Incremented with each busy call */ }; /* ** Name of the master database table. The master database table ** is a special table that holds the names and attributes of all ** user tables and indices. */ |
14694 14695 14696 14697 14698 14699 14700 | #endif SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); | | | 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 | #endif SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree*); SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int,int*); SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); |
14956 14957 14958 14959 14960 14961 14962 | SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); #ifndef NDEBUG SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); #endif SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); | < < | 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 | SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); #ifndef NDEBUG SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); #endif SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); #ifdef SQLITE_TEST SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); #endif #ifndef SQLITE_OMIT_WAL |
15251 15252 15253 15254 15255 15256 15257 | #define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]<r[P1] */ #define OP_Ge 57 /* jump, same as TK_GE, synopsis: IF r[P3]>=r[P1] */ #define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */ #define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */ #define OP_IncrVacuum 60 /* jump */ #define OP_VNext 61 /* jump */ #define OP_Init 62 /* jump, synopsis: Start at P2 */ | | | | 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 | #define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]<r[P1] */ #define OP_Ge 57 /* jump, same as TK_GE, synopsis: IF r[P3]>=r[P1] */ #define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */ #define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */ #define OP_IncrVacuum 60 /* jump */ #define OP_VNext 61 /* jump */ #define OP_Init 62 /* jump, synopsis: Start at P2 */ #define OP_PureFunc 63 /* synopsis: r[P3]=func(r[P2@NP]) */ #define OP_Function 64 /* synopsis: r[P3]=func(r[P2@NP]) */ #define OP_Return 65 #define OP_EndCoroutine 66 #define OP_HaltIfNull 67 /* synopsis: if r[P3]=null halt */ #define OP_Halt 68 #define OP_Integer 69 /* synopsis: r[P2]=P1 */ #define OP_Int64 70 /* synopsis: r[P2]=P4 */ #define OP_String 71 /* synopsis: r[P2]='P4' (len=P1) */ |
15318 15319 15320 15321 15322 15323 15324 | #define OP_ResetCount 123 #define OP_SorterCompare 124 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ #define OP_SorterData 125 /* synopsis: r[P2]=data */ #define OP_RowData 126 /* synopsis: r[P2]=data */ #define OP_Rowid 127 /* synopsis: r[P2]=rowid */ #define OP_NullRow 128 #define OP_SeekEnd 129 | | | | 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 | #define OP_ResetCount 123 #define OP_SorterCompare 124 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ #define OP_SorterData 125 /* synopsis: r[P2]=data */ #define OP_RowData 126 /* synopsis: r[P2]=data */ #define OP_Rowid 127 /* synopsis: r[P2]=rowid */ #define OP_NullRow 128 #define OP_SeekEnd 129 #define OP_IdxInsert 130 /* synopsis: key=r[P2] */ #define OP_SorterInsert 131 /* synopsis: key=r[P2] */ #define OP_IdxDelete 132 /* synopsis: key=r[P2@P3] */ #define OP_DeferredSeek 133 /* synopsis: Move P3 to P1.rowid if needed */ #define OP_IdxRowid 134 /* synopsis: r[P2]=rowid */ #define OP_FinishSeek 135 #define OP_Destroy 136 #define OP_Clear 137 #define OP_ResetSorter 138 |
15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 | SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); #else # define sqlite3VdbeReleaseRegisters(P,A,N,M,F) #endif | > | 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 | SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); #else # define sqlite3VdbeReleaseRegisters(P,A,N,M,F) #endif |
15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 | typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); /* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on ** each VDBE opcode. ** ** Use the SQLITE_ENABLE_MODULE_COMMENTS macro to see some extra no-op ** comments in VDBE programs that show key decision points in the code ** generator. | > > > | 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 | typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); #ifdef SQLITE_ENABLE_BYTECODE_VTAB SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); #endif /* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on ** each VDBE opcode. ** ** Use the SQLITE_ENABLE_MODULE_COMMENTS macro to see some extra no-op ** comments in VDBE programs that show key decision points in the code ** generator. |
15768 15769 15770 15771 15772 15773 15774 | ); SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*); SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); /* Functions used to configure a Pager object. */ SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); | < < < | 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 | ); SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*); SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); /* Functions used to configure a Pager object. */ SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager*, int); SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); SQLITE_PRIVATE void sqlite3PagerSetFlags(Pager*,unsigned); SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); |
15820 15821 15822 15823 15824 15825 15826 | #ifndef SQLITE_OMIT_WAL SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); # ifdef SQLITE_ENABLE_SNAPSHOT | | | > > > > > > > > | 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 | #ifndef SQLITE_OMIT_WAL SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); # ifdef SQLITE_ENABLE_SNAPSHOT SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot); SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager); # endif #endif #if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager*, int); SQLITE_PRIVATE void sqlite3PagerWalDb(Pager*, sqlite3*); #else # define sqlite3PagerWalWriteLock(y,z) SQLITE_OK # define sqlite3PagerWalDb(x,y) #endif #ifdef SQLITE_DIRECT_OVERFLOW_READ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); #endif #ifdef SQLITE_ENABLE_ZIPVFS SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); |
15853 15854 15855 15856 15857 15858 15859 | SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); | < < < < < < < < < | 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 | SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); /* Functions used to truncate the database file. */ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); SQLITE_PRIVATE void sqlite3PagerRekey(DbPage*, Pgno, u16); /* Functions to support testing and debugging. */ #if !defined(NDEBUG) || defined(SQLITE_TEST) SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); #endif #ifdef SQLITE_TEST SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); |
16535 16536 16537 16538 16539 16540 16541 | ** ** DB_UnresetViews means that one or more views have column names that ** have been filled out. If the schema changes, these column names might ** changes and so the view will need to be reset. */ #define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ #define DB_UnresetViews 0x0002 /* Some views have defined column names */ | < | 16631 16632 16633 16634 16635 16636 16637 16638 16639 16640 16641 16642 16643 16644 | ** ** DB_UnresetViews means that one or more views have column names that ** have been filled out. If the schema changes, these column names might ** changes and so the view will need to be reset. */ #define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ #define DB_UnresetViews 0x0002 /* Some views have defined column names */ #define DB_ResetWanted 0x0008 /* Reset the schema when nSchemaLock==0 */ /* ** The number of different kinds of things that can be limited ** using the sqlite3_limit() interface. */ #define SQLITE_N_LIMIT (SQLITE_LIMIT_WORKER_THREADS+1) |
16693 16694 16695 16696 16697 16698 16699 | /* ** Each database connection is an instance of the following structure. */ struct sqlite3 { sqlite3_vfs *pVfs; /* OS Interface */ struct Vdbe *pVdbe; /* List of active virtual machines */ | | | 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 | /* ** Each database connection is an instance of the following structure. */ struct sqlite3 { sqlite3_vfs *pVfs; /* OS Interface */ struct Vdbe *pVdbe; /* List of active virtual machines */ CollSeq *pDfltColl; /* BINARY collseq for the database encoding */ sqlite3_mutex *mutex; /* Connection mutex */ Db *aDb; /* All backends */ int nDb; /* Number of backends currently in use */ u32 mDbFlags; /* flags recording internal state */ u64 flags; /* flags settable by pragmas. See below */ i64 lastRowid; /* ROWID of most recent insert (see above) */ i64 szMmap; /* Default mmap_size setting */ |
16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 | VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ #endif Hash aFunc; /* Hash table of connection functions */ Hash aCollSeq; /* All collating sequences */ BusyHandler busyHandler; /* Busy callback */ Db aDbStatic[2]; /* Static space for the 2 default backends */ Savepoint *pSavepoint; /* List of active savepoints */ int busyTimeout; /* Busy handler timeout, in msec */ int nSavepoint; /* Number of non-transaction savepoints */ int nStatement; /* Number of nested statement-transactions */ i64 nDeferredCons; /* Net deferred constraints this transaction. */ i64 nDeferredImmCons; /* Net deferred immediate constraints */ int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY | > | 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 | VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ #endif Hash aFunc; /* Hash table of connection functions */ Hash aCollSeq; /* All collating sequences */ BusyHandler busyHandler; /* Busy callback */ Db aDbStatic[2]; /* Static space for the 2 default backends */ Savepoint *pSavepoint; /* List of active savepoints */ int nAnalysisLimit; /* Number of index rows to ANALYZE */ int busyTimeout; /* Busy handler timeout, in msec */ int nSavepoint; /* Number of non-transaction savepoints */ int nStatement; /* Number of nested statement-transactions */ i64 nDeferredCons; /* Net deferred constraints this transaction. */ i64 nDeferredImmCons; /* Net deferred immediate constraints */ int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY |
16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 | */ #define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ #define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ #define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ #define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ #define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the ** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to ** selectively disable various optimizations. */ #define SQLITE_QueryFlattener 0x0001 /* Query flattening */ | > | 16998 16999 17000 17001 17002 17003 17004 17005 17006 17007 17008 17009 17010 17011 17012 | */ #define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ #define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ #define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ #define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ #define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ #define DBFLAG_EncodingFixed 0x0040 /* No longer possible to change enc. */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the ** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to ** selectively disable various optimizations. */ #define SQLITE_QueryFlattener 0x0001 /* Query flattening */ |
17020 17021 17022 17023 17024 17025 17026 | #define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ #define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ #define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ #define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ | | > | 17117 17118 17119 17120 17121 17122 17123 17124 17125 17126 17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 | #define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ #define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ #define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ #define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ /* 0x0200 -- available for reuse */ #define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ #define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ #define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ #define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ #define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ /* Identifier numbers for each in-line function */ #define INLINEFUNC_coalesce 0 #define INLINEFUNC_implies_nonnull_row 1 #define INLINEFUNC_expr_implies_expr 2 #define INLINEFUNC_expr_compare 3 #define INLINEFUNC_affinity 4 #define INLINEFUNC_iif 5 #define INLINEFUNC_unlikely 99 /* Default case */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are ** used to create the initializers for the FuncDef structures. ** ** FUNCTION(zName, nArg, iArg, bNC, xFunc) |
17205 17206 17207 17208 17209 17210 17211 17212 17213 17214 17215 17216 17217 17218 | struct Column { char *zName; /* Name of this column, \000, then the type */ Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ char *zColl; /* Collating sequence. If NULL, use the default */ u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; /* Allowed values for Column.colFlags: */ #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ #define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ | > | 17303 17304 17305 17306 17307 17308 17309 17310 17311 17312 17313 17314 17315 17316 17317 | struct Column { char *zName; /* Name of this column, \000, then the type */ Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ char *zColl; /* Collating sequence. If NULL, use the default */ u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ u8 hName; /* Column name hash for faster lookup */ u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; /* Allowed values for Column.colFlags: */ #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ #define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ |
17865 17866 17867 17868 17869 17870 17871 17872 17873 17874 17875 17876 17877 17878 | struct Expr { u8 op; /* Operation performed by this node */ char affExpr; /* affinity, or RAISE type */ u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op ** TK_COLUMN: the value of p5 for OP_Column ** TK_AGG_FUNCTION: nesting depth ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ u32 flags; /* Various flags. EP_* See below */ union { char *zToken; /* Token value. Zero terminated and dequoted */ int iValue; /* Non-negative integer value if EP_IntValue */ } u; /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no | > > > | 17964 17965 17966 17967 17968 17969 17970 17971 17972 17973 17974 17975 17976 17977 17978 17979 17980 | struct Expr { u8 op; /* Operation performed by this node */ char affExpr; /* affinity, or RAISE type */ u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op ** TK_COLUMN: the value of p5 for OP_Column ** TK_AGG_FUNCTION: nesting depth ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ #ifdef SQLITE_DEBUG u8 vvaFlags; /* Verification flags. */ #endif u32 flags; /* Various flags. EP_* See below */ union { char *zToken; /* Token value. Zero terminated and dequoted */ int iValue; /* Non-negative integer value if EP_IntValue */ } u; /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no |
17939 17940 17941 17942 17943 17944 17945 | #define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ #define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ #define EP_Skip 0x001000 /* Operator does not contribute to affinity */ #define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ #define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ | | > > > > > > > | > > > > | 18041 18042 18043 18044 18045 18046 18047 18048 18049 18050 18051 18052 18053 18054 18055 18056 18057 18058 18059 18060 18061 18062 18063 18064 18065 18066 18067 18068 18069 18070 18071 18072 18073 18074 18075 18076 18077 18078 18079 18080 18081 18082 18083 18084 18085 18086 18087 18088 18089 18090 18091 18092 18093 18094 18095 18096 18097 18098 18099 18100 18101 18102 18103 18104 18105 | #define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ #define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ #define EP_Skip 0x001000 /* Operator does not contribute to affinity */ #define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ #define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ /* 0x020000 // available for reuse */ #define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ #define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ #define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ #define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ #define EP_Alias 0x400000 /* Is an alias for a result set column */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ #define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ #define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ #define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ #define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ #define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ #define EP_FromDDL 0x40000000 /* Originates from sqlite_master */ /* 0x80000000 // Available */ /* ** The EP_Propagate mask is a set of properties that automatically propagate ** upwards into parent nodes. */ #define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc) /* ** These macros can be used to test, set, or clear bits in the ** Expr.flags field. */ #define ExprHasProperty(E,P) (((E)->flags&(P))!=0) #define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) #define ExprSetProperty(E,P) (E)->flags|=(P) #define ExprClearProperty(E,P) (E)->flags&=~(P) #define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) #define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) /* Flags for use with Expr.vvaFlags */ #define EP_NoReduce 0x01 /* Cannot EXPRDUP_REDUCE this Expr */ #define EP_Immutable 0x02 /* Do not change this Expr node */ /* The ExprSetVVAProperty() macro is used for Verification, Validation, ** and Accreditation only. It works like ExprSetProperty() during VVA ** processes but is a no-op for delivery. */ #ifdef SQLITE_DEBUG # define ExprSetVVAProperty(E,P) (E)->vvaFlags|=(P) # define ExprHasVVAProperty(E,P) (((E)->vvaFlags&(P))!=0) # define ExprClearVVAProperties(E) (E)->vvaFlags = 0 #else # define ExprSetVVAProperty(E,P) # define ExprHasVVAProperty(E,P) 0 # define ExprClearVVAProperties(E) #endif /* ** Macros to determine the number of bytes required by a normal Expr ** struct, an Expr struct with the EP_Reduced flag set in Expr.flags ** and an Expr struct with the EP_TokenOnly flag set. */ |
18952 18953 18954 18955 18956 18957 18958 18959 18960 18961 18962 18963 18964 18965 | struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */ ExprList *pGroupBy; /* GROUP BY clause */ Select *pSelect; /* HAVING to WHERE clause ctx */ struct WindowRewrite *pRewrite; /* Window rewrite context */ struct WhereConst *pConst; /* WHERE clause constants */ struct RenameCtx *pRename; /* RENAME COLUMN context */ struct Table *pTab; /* Table of generated column */ } u; }; /* Forward declarations */ SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); | > | 19065 19066 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078 19079 | struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */ ExprList *pGroupBy; /* GROUP BY clause */ Select *pSelect; /* HAVING to WHERE clause ctx */ struct WindowRewrite *pRewrite; /* Window rewrite context */ struct WhereConst *pConst; /* WHERE clause constants */ struct RenameCtx *pRename; /* RENAME COLUMN context */ struct Table *pTab; /* Table of generated column */ struct SrcList_item *pSrcItem; /* A single FROM clause item */ } u; }; /* Forward declarations */ SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); |
19197 19198 19199 19200 19201 19202 19203 | SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*); SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*); | < | 19311 19312 19313 19314 19315 19316 19317 19318 19319 19320 19321 19322 19323 19324 | SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*); SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*); SQLITE_PRIVATE int sqlite3MallocSize(void*); SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*); SQLITE_PRIVATE void *sqlite3PageMalloc(int); SQLITE_PRIVATE void sqlite3PageFree(void*); SQLITE_PRIVATE void sqlite3MemSetDefault(void); #ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); |
19388 19389 19390 19391 19392 19393 19394 | SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*); SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); | < < < | < | 19501 19502 19503 19504 19505 19506 19507 19508 19509 19510 19511 19512 19513 19514 19515 | SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*); SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); #define sqlite3CodecQueryParameters(A,B,C) 0 SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); #ifdef SQLITE_UNTESTABLE # define sqlite3FaultSim(X) SQLITE_OK #else SQLITE_PRIVATE int sqlite3FaultSim(int); #endif |
19501 19502 19503 19504 19505 19506 19507 | SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); #ifndef SQLITE_OMIT_GENERATED_COLUMNS SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); #endif SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); | | | 19610 19611 19612 19613 19614 19615 19616 19617 19618 19619 19620 19621 19622 19623 19624 | SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); #ifndef SQLITE_OMIT_GENERATED_COLUMNS SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); #endif SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); #define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ #define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ #define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ |
19656 19657 19658 19659 19660 19661 19662 19663 19664 19665 19666 19667 19668 19669 | SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int); #else # define sqlite3AuthRead(a,b,c,d) # define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK # define sqlite3AuthContextPush(a,b,c) # define sqlite3AuthContextPop(a) ((void)(a)) #endif SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); SQLITE_PRIVATE void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*); | > | 19765 19766 19767 19768 19769 19770 19771 19772 19773 19774 19775 19776 19777 19778 19779 | SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int); #else # define sqlite3AuthRead(a,b,c,d) # define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK # define sqlite3AuthContextPush(a,b,c) # define sqlite3AuthContextPop(a) ((void)(a)) #endif SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName); SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); SQLITE_PRIVATE void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*); |
19715 19716 19717 19718 19719 19720 19721 | sqlite3PutVarint((A),(B))) #define getVarint sqlite3GetVarint #define putVarint sqlite3PutVarint SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); | | | | | 19825 19826 19827 19828 19829 19830 19831 19832 19833 19834 19835 19836 19837 19838 19839 19840 19841 19842 | sqlite3PutVarint((A),(B))) #define getVarint sqlite3GetVarint #define putVarint sqlite3PutVarint SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2); SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity); SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table*,int); SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr); SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8); SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*); SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); SQLITE_PRIVATE u8 sqlite3HexToInt(int h); |
19741 19742 19743 19744 19745 19746 19747 | #endif SQLITE_PRIVATE const char *sqlite3ErrStr(int); SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq*); SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); | > | | | | 19851 19852 19853 19854 19855 19856 19857 19858 19859 19860 19861 19862 19863 19864 19865 19866 19867 19868 | #endif SQLITE_PRIVATE const char *sqlite3ErrStr(int); SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq*); SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8); SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr); SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr); SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,const Expr*,const Expr*); SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*); SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*); SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); |
19810 19811 19812 19813 19814 19815 19816 19817 19818 19819 19820 19821 19822 19823 19824 19825 19826 19827 19828 19829 19830 19831 | SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); SQLITE_PRIVATE int sqlite3MatchEName( const struct ExprList_item*, const char*, const char*, const char* ); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse*, void*, Token*); SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom); SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*); SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*); SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*); SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); | > > | | 19921 19922 19923 19924 19925 19926 19927 19928 19929 19930 19931 19932 19933 19934 19935 19936 19937 19938 19939 19940 19941 19942 19943 19944 19945 19946 19947 19948 19949 19950 19951 19952 | SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); SQLITE_PRIVATE int sqlite3MatchEName( const struct ExprList_item*, const char*, const char*, const char* ); SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr*); SQLITE_PRIVATE u8 sqlite3StrIHash(const char*); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse*, void*, Token*); SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom); SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*); SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*); SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*); SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*); SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*); SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *); SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB); SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*); SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*); SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int); SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); |
19950 19951 19952 19953 19954 19955 19956 19957 19958 19959 19960 19961 19962 19963 19964 19965 | void(*)(void*) ); # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) #endif SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db); #ifndef SQLITE_OMIT_VIRTUALTABLE SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); #else # define sqlite3ShadowTableName(A,B) 0 #endif SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*); | > > | 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 20075 20076 20077 20078 20079 20080 | void(*)(void*) ); # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) #endif SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db); #ifndef SQLITE_OMIT_VIRTUALTABLE SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*); #else # define sqlite3ShadowTableName(A,B) 0 # define sqlite3IsShadowTableOf(A,B,C) 0 #endif SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*); |
19974 19975 19976 19977 19978 19979 19980 | SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE void sqlite3ParserReset(Parse*); #ifdef SQLITE_ENABLE_NORMALIZE SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); #endif SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); | | | | 20089 20090 20091 20092 20093 20094 20095 20096 20097 20098 20099 20100 20101 20102 20103 20104 | SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE void sqlite3ParserReset(Parse*); #ifdef SQLITE_ENABLE_NORMALIZE SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); #endif SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse*,const Expr*); SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, const Expr*, const Expr*); SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*); SQLITE_PRIVATE const char *sqlite3JournalModename(int); #ifndef SQLITE_OMIT_WAL SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*); SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int); #endif #ifndef SQLITE_OMIT_CTE |
20329 20330 20331 20332 20333 20334 20335 | ** ** EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled ** using the SQLITE_USE_URI=1 or SQLITE_USE_URI=0 compile-time options. ** ** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally ** disabled. The default value may be changed by compiling with the ** SQLITE_USE_URI symbol defined. | < < < < < < | < | 20444 20445 20446 20447 20448 20449 20450 20451 20452 20453 20454 20455 20456 20457 20458 20459 20460 | ** ** EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled ** using the SQLITE_USE_URI=1 or SQLITE_USE_URI=0 compile-time options. ** ** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally ** disabled. The default value may be changed by compiling with the ** SQLITE_USE_URI symbol defined. */ #ifndef SQLITE_USE_URI # define SQLITE_USE_URI 0 #endif /* EVIDENCE-OF: R-38720-18127 The default setting is determined by the ** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if ** that compile-time option is omitted. */ #if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) |
20568 20569 20570 20571 20572 20573 20574 | #endif /* ** VDBE_DISPLAY_P4 is true or false depending on whether or not the ** "explain" P4 display logic is enabled. */ #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ | | > | 20676 20677 20678 20679 20680 20681 20682 20683 20684 20685 20686 20687 20688 20689 20690 20691 | #endif /* ** VDBE_DISPLAY_P4 is true or false depending on whether or not the ** "explain" P4 display logic is enabled. */ #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) \ || defined(SQLITE_ENABLE_BYTECODE_VTAB) # define VDBE_DISPLAY_P4 1 #else # define VDBE_DISPLAY_P4 0 #endif /* ** SQL is translated into a sequence of instructions to be |
20955 20956 20957 20958 20959 20960 20961 20962 20963 | int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ #endif u16 nResColumn; /* Number of columns in one row of the result set */ u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ bft expired:2; /* 1: recompile VM immediately 2: when convenient */ bft explain:2; /* True if EXPLAIN present on SQL command */ | > < | 21064 21065 21066 21067 21068 21069 21070 21071 21072 21073 21074 21075 21076 21077 21078 21079 21080 | int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ #endif u16 nResColumn; /* Number of columns in one row of the result set */ u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ u8 doingRerun; /* True if rerunning after an auto-reprepare */ bft expired:2; /* 1: recompile VM immediately 2: when convenient */ bft explain:2; /* True if EXPLAIN present on SQL command */ bft changeCntOn:1; /* True to update the change-counter */ bft runOnlyOnce:1; /* Automatically expire on reset */ bft usesStmtJournal:1; /* True if uses a statement journal */ bft readOnly:1; /* True for statements that do not write */ bft bIsReader:1; /* True for statements that read */ yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ |
21033 21034 21035 21036 21037 21038 21039 | SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); | > > > > > > > | | 21142 21143 21144 21145 21146 21147 21148 21149 21150 21151 21152 21153 21154 21155 21156 21157 21158 21159 21160 21161 21162 21163 | SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); #if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) SQLITE_PRIVATE int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3*,Op*); #endif #if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) SQLITE_PRIVATE char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); #endif #if !defined(SQLITE_OMIT_EXPLAIN) SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*); #endif SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*); SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int); SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*); SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int); |
21069 21070 21071 21072 21073 21074 21075 21076 21077 21078 21079 21080 | SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); #endif | > | | 21185 21186 21187 21188 21189 21190 21191 21192 21193 21194 21195 21196 21197 21198 21199 21200 21201 21202 21203 21204 21205 | SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); #endif #if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) SQLITE_PRIVATE const char *sqlite3OpcodeName(int); #endif SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame*); |
22154 22155 22156 22157 22158 22159 22160 | static const struct { u8 eType; /* Transformation type code */ u8 nName; /* Length of th name */ char *zName; /* Name of the transformation */ double rLimit; /* Maximum NNN value for this transform */ double rXform; /* Constant used for this transform */ } aXformType[] = { | | | | | | | | 22271 22272 22273 22274 22275 22276 22277 22278 22279 22280 22281 22282 22283 22284 22285 22286 22287 22288 22289 22290 | static const struct { u8 eType; /* Transformation type code */ u8 nName; /* Length of th name */ char *zName; /* Name of the transformation */ double rLimit; /* Maximum NNN value for this transform */ double rXform; /* Constant used for this transform */ } aXformType[] = { { 0, 6, "second", 464269060800.0, 1000.0 }, { 0, 6, "minute", 7737817680.0, 60000.0 }, { 0, 4, "hour", 128963628.0, 3600000.0 }, { 0, 3, "day", 5373485.0, 86400000.0 }, { 1, 5, "month", 176546.0, 2592000000.0 }, { 2, 4, "year", 14713.0, 31536000000.0 }, }; /* ** Process a modifier to a date-time stamp. The modifiers are ** as follows: ** ** NNN days |
25719 25720 25721 25722 25723 25724 25725 25726 25727 25728 25729 25730 25731 25732 | assert( sqlite3GlobalConfig.mutex.xMutexInit ); rc = sqlite3GlobalConfig.mutex.xMutexInit(); #ifdef SQLITE_DEBUG GLOBAL(int, mutexIsInit) = 1; #endif return rc; } /* ** Shutdown the mutex system. This call frees resources allocated by ** sqlite3MutexInit(). */ | > | 25836 25837 25838 25839 25840 25841 25842 25843 25844 25845 25846 25847 25848 25849 25850 | assert( sqlite3GlobalConfig.mutex.xMutexInit ); rc = sqlite3GlobalConfig.mutex.xMutexInit(); #ifdef SQLITE_DEBUG GLOBAL(int, mutexIsInit) = 1; #endif sqlite3MemoryBarrier(); return rc; } /* ** Shutdown the mutex system. This call frees resources allocated by ** sqlite3MutexInit(). */ |
27246 27247 27248 27249 27250 27251 27252 | return priorLimit; } if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ n = mem0.hardLimit; } mem0.alarmThreshold = n; nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); | | | 27364 27365 27366 27367 27368 27369 27370 27371 27372 27373 27374 27375 27376 27377 27378 | return priorLimit; } if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ n = mem0.hardLimit; } mem0.alarmThreshold = n; nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); AtomicStore(&mem0.nearlyFull, n>0 && n<=nUsed); sqlite3_mutex_leave(mem0.mutex); excess = sqlite3_memory_used() - n; if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); return priorLimit; } SQLITE_API void sqlite3_soft_heap_limit(int n){ if( n<0 ) n = 0; |
27314 27315 27316 27317 27318 27319 27320 | /* ** Return true if the heap is currently under memory pressure - in other ** words if the amount of heap used is close to the limit set by ** sqlite3_soft_heap_limit(). */ SQLITE_PRIVATE int sqlite3HeapNearlyFull(void){ | | | 27432 27433 27434 27435 27436 27437 27438 27439 27440 27441 27442 27443 27444 27445 27446 | /* ** Return true if the heap is currently under memory pressure - in other ** words if the amount of heap used is close to the limit set by ** sqlite3_soft_heap_limit(). */ SQLITE_PRIVATE int sqlite3HeapNearlyFull(void){ return AtomicLoad(&mem0.nearlyFull); } /* ** Deinitialize the memory allocation subsystem. */ SQLITE_PRIVATE void sqlite3MallocEnd(void){ if( sqlite3GlobalConfig.m.xShutdown ){ |
27378 27379 27380 27381 27382 27383 27384 | ** following xRoundup() call. */ nFull = sqlite3GlobalConfig.m.xRoundup(n); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); if( mem0.alarmThreshold>0 ){ sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.alarmThreshold - nFull ){ | | | | 27496 27497 27498 27499 27500 27501 27502 27503 27504 27505 27506 27507 27508 27509 27510 27511 27512 27513 27514 27515 27516 27517 27518 27519 27520 | ** following xRoundup() call. */ nFull = sqlite3GlobalConfig.m.xRoundup(n); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); if( mem0.alarmThreshold>0 ){ sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.alarmThreshold - nFull ){ AtomicStore(&mem0.nearlyFull, 1); sqlite3MallocAlarm(nFull); if( mem0.hardLimit ){ nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.hardLimit - nFull ){ *pp = 0; return; } } }else{ AtomicStore(&mem0.nearlyFull, 0); } } p = sqlite3GlobalConfig.m.xMalloc(nFull); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT if( p==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm(nFull); p = sqlite3GlobalConfig.m.xMalloc(nFull); |
27617 27618 27619 27620 27621 27622 27623 27624 27625 27626 27627 27628 27629 27630 27631 27632 27633 27634 | sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); } pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); if( pNew==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm((int)nBytes); pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } if( pNew ){ nNew = sqlite3MallocSize(pNew); sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); } sqlite3_mutex_leave(mem0.mutex); }else{ pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); | > > | 27735 27736 27737 27738 27739 27740 27741 27742 27743 27744 27745 27746 27747 27748 27749 27750 27751 27752 27753 27754 | sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); } pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT if( pNew==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm((int)nBytes); pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } #endif if( pNew ){ nNew = sqlite3MallocSize(pNew); sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); } sqlite3_mutex_leave(mem0.mutex); }else{ pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); |
27805 27806 27807 27808 27809 27810 27811 | memcpy(pNew, p, lookasideMallocSize(db, p)); sqlite3DbFree(db, p); } }else{ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); | | | 27925 27926 27927 27928 27929 27930 27931 27932 27933 27934 27935 27936 27937 27938 27939 | memcpy(pNew, p, lookasideMallocSize(db, p)); sqlite3DbFree(db, p); } }else{ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); pNew = sqlite3Realloc(p, n); if( !pNew ){ sqlite3OomFault(db); } sqlite3MemdebugSetType(pNew, (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); } } |
27895 27896 27897 27898 27899 27900 27901 | ** temporarily disable the lookaside memory allocator and interrupt ** any running VDBEs. */ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ db->mallocFailed = 1; if( db->nVdbeExec>0 ){ | | | | 28015 28016 28017 28018 28019 28020 28021 28022 28023 28024 28025 28026 28027 28028 28029 28030 28031 28032 28033 28034 28035 28036 28037 28038 28039 28040 28041 28042 28043 28044 28045 28046 28047 28048 | ** temporarily disable the lookaside memory allocator and interrupt ** any running VDBEs. */ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ db->mallocFailed = 1; if( db->nVdbeExec>0 ){ AtomicStore(&db->u1.isInterrupted, 1); } DisableLookaside; if( db->pParse ){ db->pParse->rc = SQLITE_NOMEM_BKPT; } } } /* ** This routine reactivates the memory allocator and clears the ** db->mallocFailed flag as necessary. ** ** The memory allocator is not restarted if there are running ** VDBEs. */ SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ if( db->mallocFailed && db->nVdbeExec==0 ){ db->mallocFailed = 0; AtomicStore(&db->u1.isInterrupted, 0); assert( db->lookaside.bDisable>0 ); EnableLookaside; } } /* ** Take actions at the end of an API call to indicate an OOM error |
28882 28883 28884 28885 28886 28887 28888 | return 0; }else{ p->nAlloc = (int)szNew; } if( p->db ){ zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); }else{ | | | 29002 29003 29004 29005 29006 29007 29008 29009 29010 29011 29012 29013 29014 29015 29016 | return 0; }else{ p->nAlloc = (int)szNew; } if( p->db ){ zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); }else{ zNew = sqlite3Realloc(zOld, p->nAlloc); } if( zNew ){ assert( p->zText!=0 || p->nChar==0 ); if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); p->zText = zNew; p->nAlloc = sqlite3DbMallocSize(p->db, zNew); p->printfFlags |= SQLITE_PRINTF_MALLOCED; |
29224 29225 29226 29227 29228 29229 29230 | ** A version of printf() that understands %lld. Used for debugging. ** The printf() built into some versions of windows does not understand %lld ** and segfaults if you give it a long long int. */ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ va_list ap; StrAccum acc; | | | 29344 29345 29346 29347 29348 29349 29350 29351 29352 29353 29354 29355 29356 29357 29358 | ** A version of printf() that understands %lld. Used for debugging. ** The printf() built into some versions of windows does not understand %lld ** and segfaults if you give it a long long int. */ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ va_list ap; StrAccum acc; char zBuf[SQLITE_PRINT_BUF_SIZE*10]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); va_start(ap,zFormat); sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); sqlite3StrAccumFinish(&acc); #ifdef SQLITE_OS_TRACE_PROC { |
29396 29397 29398 29399 29400 29401 29402 | sqlite3_str_appendf(&x, "{%d:*}", pItem->iCursor); if( pItem->zDatabase ){ sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); }else if( pItem->zName ){ sqlite3_str_appendf(&x, " %s", pItem->zName); } if( pItem->pTab ){ | | | | 29516 29517 29518 29519 29520 29521 29522 29523 29524 29525 29526 29527 29528 29529 29530 29531 | sqlite3_str_appendf(&x, "{%d:*}", pItem->iCursor); if( pItem->zDatabase ){ sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); }else if( pItem->zName ){ sqlite3_str_appendf(&x, " %s", pItem->zName); } if( pItem->pTab ){ sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); } if( pItem->zAlias ){ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); } if( pItem->fg.jointype & JT_LEFT ){ sqlite3_str_appendf(&x, " LEFT-JOIN"); } |
29656 29657 29658 29659 29660 29661 29662 | /* ** Generate a human-readable explanation of an expression tree. */ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ const char *zBinOp = 0; /* Binary operator */ const char *zUniOp = 0; /* Unary operator */ | | | > > > | 29776 29777 29778 29779 29780 29781 29782 29783 29784 29785 29786 29787 29788 29789 29790 29791 29792 29793 29794 29795 29796 29797 29798 29799 29800 29801 29802 29803 29804 29805 29806 29807 29808 29809 | /* ** Generate a human-readable explanation of an expression tree. */ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ const char *zBinOp = 0; /* Binary operator */ const char *zUniOp = 0; /* Unary operator */ char zFlgs[200]; pView = sqlite3TreeViewPush(pView, moreToFollow); if( pExpr==0 ){ sqlite3TreeViewLine(pView, "nil"); sqlite3TreeViewPop(pView); return; } if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ StrAccum x; sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); sqlite3_str_appendf(&x, " fg.af=%x.%c", pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); if( ExprHasProperty(pExpr, EP_FromJoin) ){ sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); } if( ExprHasProperty(pExpr, EP_FromDDL) ){ sqlite3_str_appendf(&x, " DDL"); } if( ExprHasVVAProperty(pExpr, EP_Immutable) ){ sqlite3_str_appendf(&x, " IMMUTABLE"); } sqlite3StrAccumFinish(&x); }else{ zFlgs[0] = 0; } switch( pExpr->op ){ case TK_AGG_COLUMN: { |
29780 29781 29782 29783 29784 29785 29786 29787 29788 29789 29790 29791 29792 29793 | case TK_BITAND: zBinOp = "BITAND"; break; case TK_BITOR: zBinOp = "BITOR"; break; case TK_SLASH: zBinOp = "DIV"; break; case TK_LSHIFT: zBinOp = "LSHIFT"; break; case TK_RSHIFT: zBinOp = "RSHIFT"; break; case TK_CONCAT: zBinOp = "CONCAT"; break; case TK_DOT: zBinOp = "DOT"; break; case TK_UMINUS: zUniOp = "UMINUS"; break; case TK_UPLUS: zUniOp = "UPLUS"; break; case TK_BITNOT: zUniOp = "BITNOT"; break; case TK_NOT: zUniOp = "NOT"; break; case TK_ISNULL: zUniOp = "ISNULL"; break; case TK_NOTNULL: zUniOp = "NOTNULL"; break; | > | 29903 29904 29905 29906 29907 29908 29909 29910 29911 29912 29913 29914 29915 29916 29917 | case TK_BITAND: zBinOp = "BITAND"; break; case TK_BITOR: zBinOp = "BITOR"; break; case TK_SLASH: zBinOp = "DIV"; break; case TK_LSHIFT: zBinOp = "LSHIFT"; break; case TK_RSHIFT: zBinOp = "RSHIFT"; break; case TK_CONCAT: zBinOp = "CONCAT"; break; case TK_DOT: zBinOp = "DOT"; break; case TK_LIMIT: zBinOp = "LIMIT"; break; case TK_UMINUS: zUniOp = "UMINUS"; break; case TK_UPLUS: zUniOp = "UPLUS"; break; case TK_BITNOT: zUniOp = "BITNOT"; break; case TK_NOT: zUniOp = "NOT"; break; case TK_ISNULL: zUniOp = "ISNULL"; break; case TK_NOTNULL: zUniOp = "NOTNULL"; break; |
30551 30552 30553 30554 30555 30556 30557 | *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ *zOut++ = (u8)(c&0x00FF); \ } \ } | < < < < < < < < < < < < < < < < < < < < | 30675 30676 30677 30678 30679 30680 30681 30682 30683 30684 30685 30686 30687 30688 | *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ *zOut++ = (u8)(c&0x00FF); \ } \ } /* ** Translate a single UTF-8 character. Return the unicode value. ** ** During translation, assume that the byte that zTerm points ** is a 0x00. ** ** Write a pointer to the next unread byte back into *pzNext. |
30747 30748 30749 30750 30751 30752 30753 | pMem->n = (int)(z - zOut); *z++ = 0; }else{ assert( desiredEnc==SQLITE_UTF8 ); if( pMem->enc==SQLITE_UTF16LE ){ /* UTF-16 Little-endian -> UTF-8 */ while( zIn<zTerm ){ | > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > | 30851 30852 30853 30854 30855 30856 30857 30858 30859 30860 30861 30862 30863 30864 30865 30866 30867 30868 30869 30870 30871 30872 30873 30874 30875 30876 30877 30878 30879 30880 30881 30882 30883 30884 30885 30886 30887 30888 30889 30890 30891 30892 30893 30894 30895 30896 30897 30898 30899 30900 30901 30902 30903 30904 30905 30906 30907 30908 30909 30910 30911 30912 30913 30914 30915 30916 30917 | pMem->n = (int)(z - zOut); *z++ = 0; }else{ assert( desiredEnc==SQLITE_UTF8 ); if( pMem->enc==SQLITE_UTF16LE ){ /* UTF-16 Little-endian -> UTF-8 */ while( zIn<zTerm ){ c = *(zIn++); c += (*(zIn++))<<8; if( c>=0xd800 && c<0xe000 ){ #ifdef SQLITE_REPLACE_INVALID_UTF if( c>=0xdc00 || zIn>=zTerm ){ c = 0xfffd; }else{ int c2 = *(zIn++); c2 += (*(zIn++))<<8; if( c2<0xdc00 || c2>=0xe000 ){ zIn -= 2; c = 0xfffd; }else{ c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; } } #else if( zIn<zTerm ){ int c2 = (*zIn++); c2 += ((*zIn++)<<8); c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); } #endif } WRITE_UTF8(z, c); } }else{ /* UTF-16 Big-endian -> UTF-8 */ while( zIn<zTerm ){ c = (*(zIn++))<<8; c += *(zIn++); if( c>=0xd800 && c<0xe000 ){ #ifdef SQLITE_REPLACE_INVALID_UTF if( c>=0xdc00 || zIn>=zTerm ){ c = 0xfffd; }else{ int c2 = (*(zIn++))<<8; c2 += *(zIn++); if( c2<0xdc00 || c2>=0xe000 ){ zIn -= 2; c = 0xfffd; }else{ c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; } } #else if( zIn<zTerm ){ int c2 = ((*zIn++)<<8); c2 += (*zIn++); c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); } #endif } WRITE_UTF8(z, c); } } pMem->n = (int)(z - zOut); } *z = 0; assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); |
30912 30913 30914 30915 30916 30917 30918 | ** in pZ. nChar must be non-negative. */ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ int c; unsigned char const *z = zIn; int n = 0; | | | | | < < < < > | | < | > | 31062 31063 31064 31065 31066 31067 31068 31069 31070 31071 31072 31073 31074 31075 31076 31077 31078 31079 31080 31081 31082 31083 31084 | ** in pZ. nChar must be non-negative. */ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ int c; unsigned char const *z = zIn; int n = 0; if( SQLITE_UTF16NATIVE==SQLITE_UTF16LE ) z++; while( n<nChar ){ c = z[0]; z += 2; if( c>=0xd8 && c<0xdc && z[0]>=0xdc && z[0]<0xe0 ) z += 2; n++; } return (int)(z-(unsigned char const *)zIn) - (SQLITE_UTF16NATIVE==SQLITE_UTF16LE); } #if defined(SQLITE_TEST) /* ** This routine is called from the TCL test function "translate_selftest". ** It checks that the primitives for serializing and deserializing ** characters in each encoding are inverses of each other. |
30951 30952 30953 30954 30955 30956 30957 | z[0] = 0; z = zBuf; c = sqlite3Utf8Read((const u8**)&z); t = i; if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; assert( c==t ); | < < < < < < < < < < < < < < < < < < < < < < < < | 31098 31099 31100 31101 31102 31103 31104 31105 31106 31107 31108 31109 31110 31111 | z[0] = 0; z = zBuf; c = sqlite3Utf8Read((const u8**)&z); t = i; if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; assert( c==t ); assert( (z-zBuf)==n ); } } #endif /* SQLITE_TEST */ #endif /* SQLITE_OMIT_UTF16 */ /************** End of utf.c *************************************************/ |
31301 31302 31303 31304 31305 31306 31307 31308 31309 31310 31311 31312 31313 31314 | return 1; } a = (unsigned char *)zLeft; b = (unsigned char *)zRight; while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; } /* ** Compute 10 to the E-th power. Examples: E==1 results in 10. ** E==2 results in 100. E==50 results in 1.0e50. ** ** This routine only works for values of E between 1 and 341. */ | > > > > > > > > > > > > > | 31424 31425 31426 31427 31428 31429 31430 31431 31432 31433 31434 31435 31436 31437 31438 31439 31440 31441 31442 31443 31444 31445 31446 31447 31448 31449 31450 | return 1; } a = (unsigned char *)zLeft; b = (unsigned char *)zRight; while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; } /* ** Compute an 8-bit hash on a string that is insensitive to case differences */ SQLITE_PRIVATE u8 sqlite3StrIHash(const char *z){ u8 h = 0; if( z==0 ) return 0; while( z[0] ){ h += UpperToLower[(unsigned char)z[0]]; z++; } return h; } /* ** Compute 10 to the E-th power. Examples: E==1 results in 10. ** E==2 results in 100. E==50 results in 1.0e50. ** ** This routine only works for values of E between 1 and 341. */ |
32241 32242 32243 32244 32245 32246 32247 | #endif #ifdef SQLITE_EBCDIC h += 9*(1&~(h>>4)); #endif return (u8)(h & 0xf); } | | | | 32377 32378 32379 32380 32381 32382 32383 32384 32385 32386 32387 32388 32389 32390 32391 32392 32393 32394 32395 32396 32397 32398 32399 32400 32401 32402 32403 32404 32405 32406 32407 32408 32409 32410 32411 32412 | #endif #ifdef SQLITE_EBCDIC h += 9*(1&~(h>>4)); #endif return (u8)(h & 0xf); } #if !defined(SQLITE_OMIT_BLOB_LITERAL) /* ** Convert a BLOB literal of the form "x'hhhhhh'" into its binary ** value. Return a pointer to its binary value. Space to hold the ** binary value has been obtained from malloc and must be freed by ** the calling routine. */ SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ char *zBlob; int i; zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); n--; if( zBlob ){ for(i=0; i<n; i+=2){ zBlob[i/2] = (sqlite3HexToInt(z[i])<<4) | sqlite3HexToInt(z[i+1]); } zBlob[i/2] = 0; } return zBlob; } #endif /* !SQLITE_OMIT_BLOB_LITERAL */ /* ** Log an error that is an API call on a connection pointer that should ** not have been used. The "type" of connection pointer is given as the ** argument. The zType is a word like "NULL" or "closed" or "invalid". */ static void logBadConnection(const char *zType){ |
32973 32974 32975 32976 32977 32978 32979 | /* 56 */ "Lt" OpHelp("IF r[P3]<r[P1]"), /* 57 */ "Ge" OpHelp("IF r[P3]>=r[P1]"), /* 58 */ "ElseNotEq" OpHelp(""), /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), /* 60 */ "IncrVacuum" OpHelp(""), /* 61 */ "VNext" OpHelp(""), /* 62 */ "Init" OpHelp("Start at P2"), | | | | 33109 33110 33111 33112 33113 33114 33115 33116 33117 33118 33119 33120 33121 33122 33123 33124 | /* 56 */ "Lt" OpHelp("IF r[P3]<r[P1]"), /* 57 */ "Ge" OpHelp("IF r[P3]>=r[P1]"), /* 58 */ "ElseNotEq" OpHelp(""), /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), /* 60 */ "IncrVacuum" OpHelp(""), /* 61 */ "VNext" OpHelp(""), /* 62 */ "Init" OpHelp("Start at P2"), /* 63 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), /* 64 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), /* 65 */ "Return" OpHelp(""), /* 66 */ "EndCoroutine" OpHelp(""), /* 67 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), /* 68 */ "Halt" OpHelp(""), /* 69 */ "Integer" OpHelp("r[P2]=P1"), /* 70 */ "Int64" OpHelp("r[P2]=P4"), /* 71 */ "String" OpHelp("r[P2]='P4' (len=P1)"), |
33040 33041 33042 33043 33044 33045 33046 | /* 123 */ "ResetCount" OpHelp(""), /* 124 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), /* 125 */ "SorterData" OpHelp("r[P2]=data"), /* 126 */ "RowData" OpHelp("r[P2]=data"), /* 127 */ "Rowid" OpHelp("r[P2]=rowid"), /* 128 */ "NullRow" OpHelp(""), /* 129 */ "SeekEnd" OpHelp(""), | | | | 33176 33177 33178 33179 33180 33181 33182 33183 33184 33185 33186 33187 33188 33189 33190 33191 | /* 123 */ "ResetCount" OpHelp(""), /* 124 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), /* 125 */ "SorterData" OpHelp("r[P2]=data"), /* 126 */ "RowData" OpHelp("r[P2]=data"), /* 127 */ "Rowid" OpHelp("r[P2]=rowid"), /* 128 */ "NullRow" OpHelp(""), /* 129 */ "SeekEnd" OpHelp(""), /* 130 */ "IdxInsert" OpHelp("key=r[P2]"), /* 131 */ "SorterInsert" OpHelp("key=r[P2]"), /* 132 */ "IdxDelete" OpHelp("key=r[P2@P3]"), /* 133 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), /* 134 */ "IdxRowid" OpHelp("r[P2]=rowid"), /* 135 */ "FinishSeek" OpHelp(""), /* 136 */ "Destroy" OpHelp(""), /* 137 */ "Clear" OpHelp(""), /* 138 */ "ResetSorter" OpHelp(""), |
33982 33983 33984 33985 33986 33987 33988 | break; } if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; osClose(fd); sqlite3_log(SQLITE_WARNING, "attempt to open \"%s\" as file descriptor %d", z, fd); fd = -1; | | | 34118 34119 34120 34121 34122 34123 34124 34125 34126 34127 34128 34129 34130 34131 34132 | break; } if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; osClose(fd); sqlite3_log(SQLITE_WARNING, "attempt to open \"%s\" as file descriptor %d", z, fd); fd = -1; if( osOpen("/dev/null", O_RDONLY, m)<0 ) break; } if( fd>=0 ){ if( m!=0 ){ struct stat statbuf; if( osFstat(fd, &statbuf)==0 && statbuf.st_size==0 && (statbuf.st_mode&0777)!=m |
34858 34859 34860 34861 34862 34863 34864 34865 | # define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) #else static int osSetPosixAdvisoryLock( int h, /* The file descriptor on which to take the lock */ struct flock *pLock, /* The description of the lock */ unixFile *pFile /* Structure holding timeout value */ ){ int rc = osFcntl(h,F_SETLK,pLock); | > | | | 34994 34995 34996 34997 34998 34999 35000 35001 35002 35003 35004 35005 35006 35007 35008 35009 35010 35011 35012 35013 35014 35015 35016 35017 35018 | # define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) #else static int osSetPosixAdvisoryLock( int h, /* The file descriptor on which to take the lock */ struct flock *pLock, /* The description of the lock */ unixFile *pFile /* Structure holding timeout value */ ){ int tm = pFile->iBusyTimeout; int rc = osFcntl(h,F_SETLK,pLock); while( rc<0 && tm>0 ){ /* On systems that support some kind of blocking file lock with a timeout, ** make appropriate changes here to invoke that blocking file lock. On ** generic posix, however, there is no such API. So we simply try the ** lock once every millisecond until either the timeout expires, or until ** the lock is obtained. */ usleep(1000); rc = osFcntl(h,F_SETLK,pLock); tm--; } return rc; } #endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ /* |
36978 36979 36980 36981 36982 36983 36984 | for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); if( ii>0 ){ zDirname[ii] = '\0'; }else{ if( zDirname[0]!='/' ) zDirname[0] = '.'; zDirname[1] = 0; } | | | 37115 37116 37117 37118 37119 37120 37121 37122 37123 37124 37125 37126 37127 37128 37129 | for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); if( ii>0 ){ zDirname[ii] = '\0'; }else{ if( zDirname[0]!='/' ) zDirname[0] = '.'; zDirname[1] = 0; } fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); if( fd>=0 ){ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); } *pFd = fd; if( fd>=0 ) return SQLITE_OK; return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); } |
37288 37289 37290 37291 37292 37293 37294 37295 37296 37297 37298 37299 37300 37301 37302 | } case SQLITE_FCNTL_HAS_MOVED: { *(int*)pArg = fileHasMoved(pFile); return SQLITE_OK; } #ifdef SQLITE_ENABLE_SETLK_TIMEOUT case SQLITE_FCNTL_LOCK_TIMEOUT: { pFile->iBusyTimeout = *(int*)pArg; return SQLITE_OK; } #endif #if SQLITE_MAX_MMAP_SIZE>0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; int rc = SQLITE_OK; | > > | 37425 37426 37427 37428 37429 37430 37431 37432 37433 37434 37435 37436 37437 37438 37439 37440 37441 | } case SQLITE_FCNTL_HAS_MOVED: { *(int*)pArg = fileHasMoved(pFile); return SQLITE_OK; } #ifdef SQLITE_ENABLE_SETLK_TIMEOUT case SQLITE_FCNTL_LOCK_TIMEOUT: { int iOld = pFile->iBusyTimeout; pFile->iBusyTimeout = *(int*)pArg; *(int*)pArg = iOld; return SQLITE_OK; } #endif #if SQLITE_MAX_MMAP_SIZE>0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; int rc = SQLITE_OK; |
37607 37608 37609 37610 37611 37612 37613 37614 37615 37616 37617 37618 | /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); if( pShmNode->hShm>=0 ){ /* Initialize the locking parameters */ f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; | > | > > > > | > > | 37746 37747 37748 37749 37750 37751 37752 37753 37754 37755 37756 37757 37758 37759 37760 37761 37762 37763 37764 37765 37766 37767 37768 37769 37770 37771 37772 37773 | /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); if( pShmNode->hShm>=0 ){ int res; /* Initialize the locking parameters */ f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); if( res==-1 ){ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); #else rc = SQLITE_BUSY; #endif } } /* Update the global lock state and do debug tracing */ #ifdef SQLITE_DEBUG { u16 mask; OSTRACE(("SHM-LOCK ")); mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<<ofst); |
38109 38110 38111 38112 38113 38114 38115 38116 38117 38118 38119 38120 38121 38122 | assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); mask = (1<<(ofst+n)) - (1<<ofst); assert( n>1 || mask==(1<<ofst) ); sqlite3_mutex_enter(pShmNode->pShmMutex); if( flags & SQLITE_SHM_UNLOCK ){ u16 allMask = 0; /* Mask of locks held by siblings */ | > > > > > > > > > > > > > > > > > > > | 38255 38256 38257 38258 38259 38260 38261 38262 38263 38264 38265 38266 38267 38268 38269 38270 38271 38272 38273 38274 38275 38276 38277 38278 38279 38280 38281 38282 38283 38284 38285 38286 38287 | assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); /* Check that, if this to be a blocking lock, no locks that occur later ** in the following list than the lock being obtained are already held: ** ** 1. Checkpointer lock (ofst==1). ** 2. Write lock (ofst==0). ** 3. Read locks (ofst>=3 && ofst<SQLITE_SHM_NLOCK). ** ** In other words, if this is a blocking lock, none of the locks that ** occur later in the above list than the lock being obtained may be ** held. */ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( (ofst!=2) /* not RECOVER */ && (ofst!=1 || (p->exclMask|p->sharedMask)==0) && (ofst!=0 || (p->exclMask|p->sharedMask)<3) && (ofst<3 || (p->exclMask|p->sharedMask)<(1<<ofst)) )); #endif mask = (1<<(ofst+n)) - (1<<ofst); assert( n>1 || mask==(1<<ofst) ); sqlite3_mutex_enter(pShmNode->pShmMutex); if( flags & SQLITE_SHM_UNLOCK ){ u16 allMask = 0; /* Mask of locks held by siblings */ |
44900 44901 44902 44903 44904 44905 44906 44907 44908 44909 44910 44911 44912 44913 | pFile->ctrlFlags |= mask; } } /* Forward references to VFS helper methods used for temporary files */ static int winGetTempname(sqlite3_vfs *, char **); static int winIsDir(const void *); static BOOL winIsDriveLetterAndColon(const char *); /* ** Control and query of the open file handle. */ static int winFileControl(sqlite3_file *id, int op, void *pArg){ winFile *pFile = (winFile*)id; | > | 45065 45066 45067 45068 45069 45070 45071 45072 45073 45074 45075 45076 45077 45078 45079 | pFile->ctrlFlags |= mask; } } /* Forward references to VFS helper methods used for temporary files */ static int winGetTempname(sqlite3_vfs *, char **); static int winIsDir(const void *); static BOOL winIsLongPathPrefix(const char *); static BOOL winIsDriveLetterAndColon(const char *); /* ** Control and query of the open file handle. */ static int winFileControl(sqlite3_file *id, int op, void *pArg){ winFile *pFile = (winFile*)id; |
46669 46670 46671 46672 46673 46674 46675 | sqlite3_free(zTmpname); pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod; pFile->pVfs = pVfs; pFile->h = h; if( isReadonly ){ pFile->ctrlFlags |= WINFILE_RDONLY; } | > | > | 46835 46836 46837 46838 46839 46840 46841 46842 46843 46844 46845 46846 46847 46848 46849 46850 46851 | sqlite3_free(zTmpname); pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod; pFile->pVfs = pVfs; pFile->h = h; if( isReadonly ){ pFile->ctrlFlags |= WINFILE_RDONLY; } if( (flags & SQLITE_OPEN_MAIN_DB) && sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){ pFile->ctrlFlags |= WINFILE_PSOW; } pFile->lastErrno = NO_ERROR; pFile->zPath = zName; #if SQLITE_MAX_MMAP_SIZE>0 pFile->hMap = NULL; pFile->pMapRegion = 0; |
46878 46879 46880 46881 46882 46883 46884 46885 46886 46887 46888 46889 46890 46891 | assert(!"Invalid flags argument"); } *pResOut = rc; OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", zFilename, pResOut, *pResOut)); return SQLITE_OK; } /* ** Returns non-zero if the specified path name starts with a drive letter ** followed by a colon character. */ static BOOL winIsDriveLetterAndColon( const char *zPathname | > > > > > > > > > > > | 47046 47047 47048 47049 47050 47051 47052 47053 47054 47055 47056 47057 47058 47059 47060 47061 47062 47063 47064 47065 47066 47067 47068 47069 47070 | assert(!"Invalid flags argument"); } *pResOut = rc; OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", zFilename, pResOut, *pResOut)); return SQLITE_OK; } /* ** Returns non-zero if the specified path name starts with the "long path" ** prefix. */ static BOOL winIsLongPathPrefix( const char *zPathname ){ return ( zPathname[0]=='\\' && zPathname[1]=='\\' && zPathname[2]=='?' && zPathname[3]=='\\' ); } /* ** Returns non-zero if the specified path name starts with a drive letter ** followed by a colon character. */ static BOOL winIsDriveLetterAndColon( const char *zPathname |
46943 46944 46945 46946 46947 46948 46949 | ){ #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) DWORD nByte; void *zConverted; char *zOut; #endif | | | | > | 47122 47123 47124 47125 47126 47127 47128 47129 47130 47131 47132 47133 47134 47135 47136 47137 47138 47139 47140 | ){ #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) DWORD nByte; void *zConverted; char *zOut; #endif /* If this path name begins with "/X:" or "\\?\", where "X" is any ** alphabetic character, discard the initial "/" from the pathname. */ if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1) || winIsLongPathPrefix(zRelative+1)) ){ zRelative++; } #if defined(__CYGWIN__) SimulateIOError( return SQLITE_ERROR ); UNUSED_PARAMETER(nFull); assert( nFull>=pVfs->mxPathname ); |
47702 47703 47704 47705 47706 47707 47708 | return SQLITE_FULL; } if( newSz>p->szMax ){ return SQLITE_FULL; } newSz *= 2; if( newSz>p->szMax ) newSz = p->szMax; | | | 47882 47883 47884 47885 47886 47887 47888 47889 47890 47891 47892 47893 47894 47895 47896 | return SQLITE_FULL; } if( newSz>p->szMax ){ return SQLITE_FULL; } newSz *= 2; if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3Realloc(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; p->szAlloc = newSz; return SQLITE_OK; } /* |
48149 48150 48151 48152 48153 48154 48155 | ** This routine is called when the extension is loaded. ** Register the new VFS. */ SQLITE_PRIVATE int sqlite3MemdbInit(void){ sqlite3_vfs *pLower = sqlite3_vfs_find(0); int sz = pLower->szOsFile; memdb_vfs.pAppData = pLower; | < < | > > > | | 48329 48330 48331 48332 48333 48334 48335 48336 48337 48338 48339 48340 48341 48342 48343 48344 48345 48346 48347 | ** This routine is called when the extension is loaded. ** Register the new VFS. */ SQLITE_PRIVATE int sqlite3MemdbInit(void){ sqlite3_vfs *pLower = sqlite3_vfs_find(0); int sz = pLower->szOsFile; memdb_vfs.pAppData = pLower; /* The following conditional can only be true when compiled for ** Windows x86 and SQLITE_MAX_MMAP_SIZE=0. We always leave ** it in, to be safe, but it is marked as NO_TEST since there ** is no way to reach it under most builds. */ if( sz<sizeof(MemFile) ) sz = sizeof(MemFile); /*NO_TEST*/ memdb_vfs.szOsFile = sz; return sqlite3_vfs_register(&memdb_vfs, 0); } #endif /* SQLITE_ENABLE_DESERIALIZE */ /************** End of memdb.c ***********************************************/ /************** Begin file bitvec.c ******************************************/ |
50918 50919 50920 50921 50922 50923 50924 | sqlite3RowSetClear(pArg); sqlite3DbFree(((RowSet*)pArg)->db, pArg); } /* ** Allocate a new RowSetEntry object that is associated with the ** given RowSet. Return a pointer to the new and completely uninitialized | | | 51099 51100 51101 51102 51103 51104 51105 51106 51107 51108 51109 51110 51111 51112 51113 | sqlite3RowSetClear(pArg); sqlite3DbFree(((RowSet*)pArg)->db, pArg); } /* ** Allocate a new RowSetEntry object that is associated with the ** given RowSet. Return a pointer to the new and completely uninitialized ** object. ** ** In an OOM situation, the RowSet.db->mallocFailed flag is set and this ** routine returns NULL. */ static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ assert( p!=0 ); if( p->nFresh==0 ){ /*OPTIMIZATION-IF-FALSE*/ |
51194 51195 51196 51197 51198 51199 51200 | ** To save unnecessary work, only do this when the batch number changes. */ if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ p = pRowSet->pEntry; if( p ){ struct RowSetEntry **ppPrevTree = &pRowSet->pForest; if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ | | | 51375 51376 51377 51378 51379 51380 51381 51382 51383 51384 51385 51386 51387 51388 51389 | ** To save unnecessary work, only do this when the batch number changes. */ if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ p = pRowSet->pEntry; if( p ){ struct RowSetEntry **ppPrevTree = &pRowSet->pForest; if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ /* Only sort the current set of entries if they need it */ p = rowSetEntrySort(p); } for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ ppPrevTree = &pTree->pRight; if( pTree->pLeft==0 ){ pTree->pLeft = rowSetListToTree(p); break; |
51415 51416 51417 51418 51419 51420 51421 51422 51423 51424 51425 51426 51427 51428 | ** stored in each frame (i.e. the db page-size when the WAL was created). */ SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); #endif /* Return the sqlite3_file object for the WAL file */ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */ /************** End of wal.h *************************************************/ /************** Continuing where we left off in pager.c **********************/ | > > > > > | 51596 51597 51598 51599 51600 51601 51602 51603 51604 51605 51606 51607 51608 51609 51610 51611 51612 51613 51614 | ** stored in each frame (i.e. the db page-size when the WAL was created). */ SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); #endif /* Return the sqlite3_file object for the WAL file */ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock); SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); #endif #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */ /************** End of wal.h *************************************************/ /************** Continuing where we left off in pager.c **********************/ |
51806 51807 51808 51809 51810 51811 51812 | ** PagerSharedLock() for more detail. ** ** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in ** PAGER_OPEN state. */ #define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) | < < < < < < < < < < < < < < | 51992 51993 51994 51995 51996 51997 51998 51999 52000 52001 52002 52003 52004 52005 | ** PagerSharedLock() for more detail. ** ** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in ** PAGER_OPEN state. */ #define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) /* ** The maximum allowed sector size. 64KiB. If the xSectorsize() method ** returns a value larger than this, then MAX_SECTOR_SIZE is used instead. ** This could conceivably cause corruption following a power failure on ** such a system. This is currently an undocumented limit. */ #define MAX_SECTOR_SIZE 0x10000 |
52105 52106 52107 52108 52109 52110 52111 | void *pBusyHandlerArg; /* Context argument for xBusyHandler */ int aStat[4]; /* Total cache hits, misses, writes, spills */ #ifdef SQLITE_TEST int nRead; /* Database pages read */ #endif void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ | < < < < < < | 52277 52278 52279 52280 52281 52282 52283 52284 52285 52286 52287 52288 52289 52290 | void *pBusyHandlerArg; /* Context argument for xBusyHandler */ int aStat[4]; /* Total cache hits, misses, writes, spills */ #ifdef SQLITE_TEST int nRead; /* Database pages read */ #endif void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ PCache *pPCache; /* Pointer to page cache object */ #ifndef SQLITE_OMIT_WAL Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ char *zWal; /* File name for write-ahead log */ #endif }; |
52237 52238 52239 52240 52241 52242 52243 | ** * the database file is open, ** * there are no dirty pages in the cache, and ** * the desired page is not currently in the wal file. */ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; | < < < | 52403 52404 52405 52406 52407 52408 52409 52410 52411 52412 52413 52414 52415 52416 | ** * the database file is open, ** * there are no dirty pages in the cache, and ** * the desired page is not currently in the wal file. */ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; int rc; rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); return (rc==SQLITE_OK && iRead==0); } |
52473 52474 52475 52476 52477 52478 52479 | ** Set the Pager.xGet method for the appropriate routine used to fetch ** content from the pager. */ static void setGetterMethod(Pager *pPager){ if( pPager->errCode ){ pPager->xGet = getPageError; #if SQLITE_MAX_MMAP_SIZE>0 | | < < < < | 52636 52637 52638 52639 52640 52641 52642 52643 52644 52645 52646 52647 52648 52649 52650 | ** Set the Pager.xGet method for the appropriate routine used to fetch ** content from the pager. */ static void setGetterMethod(Pager *pPager){ if( pPager->errCode ){ pPager->xGet = getPageError; #if SQLITE_MAX_MMAP_SIZE>0 }else if( USEFETCH(pPager) ){ pPager->xGet = getPageMMap; #endif /* SQLITE_MAX_MMAP_SIZE>0 */ }else{ pPager->xGet = getPageNormal; } } |
53625 53626 53627 53628 53629 53630 53631 | while( i>0 ){ cksum += aData[i]; i -= 200; } return cksum; } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 53784 53785 53786 53787 53788 53789 53790 53791 53792 53793 53794 53795 53796 53797 | while( i>0 ){ cksum += aData[i]; i -= 200; } return cksum; } /* ** Read a single page from either the journal file (if isMainJrnl==1) or ** from the sub-journal (if isMainJrnl==0) and playback that page. ** The page begins at offset *pOffset into the file. The *pOffset ** value is increased to the start of the next page in the journal. ** ** The main rollback journal uses checksums - the statement journal does |
53705 53706 53707 53708 53709 53710 53711 | int rc; PgHdr *pPg; /* An existing page in the cache */ Pgno pgno; /* The page number of a page in journal */ u32 cksum; /* Checksum used for sanity checking */ char *aData; /* Temporary storage for the page */ sqlite3_file *jfd; /* The file descriptor for the journal file */ int isSynced; /* True if journal page is synced */ | < < < < < | 53835 53836 53837 53838 53839 53840 53841 53842 53843 53844 53845 53846 53847 53848 | int rc; PgHdr *pPg; /* An existing page in the cache */ Pgno pgno; /* The page number of a page in journal */ u32 cksum; /* Checksum used for sanity checking */ char *aData; /* Temporary storage for the page */ sqlite3_file *jfd; /* The file descriptor for the journal file */ int isSynced; /* True if journal page is synced */ assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */ assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */ assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */ aData = pPager->pTmpSpace; |
53772 53773 53774 53775 53776 53777 53778 | return rc; } /* When playing back page 1, restore the nReserve setting */ if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ pPager->nReserve = ((u8*)aData)[20]; | < | 53897 53898 53899 53900 53901 53902 53903 53904 53905 53906 53907 53908 53909 53910 | return rc; } /* When playing back page 1, restore the nReserve setting */ if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ pPager->nReserve = ((u8*)aData)[20]; } /* If the pager is in CACHEMOD state, then there must be a copy of this ** page in the pager cache. In this case just update the pager cache, ** not the database file. The page is left marked dirty in this case. ** ** An exception to the above rule: If the database is in no-sync mode |
53840 53841 53842 53843 53844 53845 53846 | /* Write the data read from the journal back into the database file. ** This is usually safe even for an encrypted database - as the data ** was encrypted before it was written to the journal file. The exception ** is if the data was just read from an in-memory sub-journal. In that ** case it must be encrypted here before it is copied into the database ** file. */ | < < < < < < < < < < < < < < | 53964 53965 53966 53967 53968 53969 53970 53971 53972 53973 53974 53975 53976 53977 53978 53979 53980 53981 53982 53983 | /* Write the data read from the journal back into the database file. ** This is usually safe even for an encrypted database - as the data ** was encrypted before it was written to the journal file. The exception ** is if the data was just read from an in-memory sub-journal. In that ** case it must be encrypted here before it is copied into the database ** file. */ rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); if( pgno>pPager->dbFileSize ){ pPager->dbFileSize = pgno; } if( pPager->pBackup ){ sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); } }else if( !isMainJrnl && pPg==0 ){ /* If this is a rollback of a savepoint and data was not written to ** the database and the page is not in-memory, there is a potential ** problem. When the page is next fetched by the b-tree layer, it ** will be read from the database file, which may or may not be |
53910 53911 53912 53913 53914 53915 53916 | pager_set_pagehash(pPg); /* If this was page 1, then restore the value of Pager.dbFileVers. ** Do this before any decoding. */ if( pgno==1 ){ memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); } | < < < < < | 54020 54021 54022 54023 54024 54025 54026 54027 54028 54029 54030 54031 54032 54033 | pager_set_pagehash(pPg); /* If this was page 1, then restore the value of Pager.dbFileVers. ** Do this before any decoding. */ if( pgno==1 ){ memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); } sqlite3PcacheRelease(pPg); } return rc; } /* ** Parameter zMaster is the name of a master journal file. A single journal |
54017 54018 54019 54020 54021 54022 54023 54024 54025 | if( rc!=SQLITE_OK ){ goto delmaster_out; } if( exists ){ /* One of the journals pointed to by the master journal exists. ** Open it and check if it points at the master journal. If ** so, return without deleting the master journal file. */ int c; | > > > | | 54122 54123 54124 54125 54126 54127 54128 54129 54130 54131 54132 54133 54134 54135 54136 54137 54138 54139 54140 54141 | if( rc!=SQLITE_OK ){ goto delmaster_out; } if( exists ){ /* One of the journals pointed to by the master journal exists. ** Open it and check if it points at the master journal. If ** so, return without deleting the master journal file. ** NB: zJournal is really a MAIN_JOURNAL. But call it a ** MASTER_JOURNAL here so that the VFS will not send the zJournal ** name into sqlite3_database_file_object(). */ int c; int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); rc = sqlite3OsOpen(pVfs, zJournal, pJournal, flags, 0); if( rc!=SQLITE_OK ){ goto delmaster_out; } rc = readMasterJournal(pJournal, zMasterPtr, nMasterPtr); sqlite3OsClose(pJournal); |
54474 54475 54476 54477 54478 54479 54480 | */ memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); }else{ u8 *dbFileVers = &((u8*)pPg->pData)[24]; memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); } } | < < | 54582 54583 54584 54585 54586 54587 54588 54589 54590 54591 54592 54593 54594 54595 | */ memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); }else{ u8 *dbFileVers = &((u8*)pPg->pData)[24]; memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); } } PAGER_INCR(sqlite3_pager_readdb_count); PAGER_INCR(pPager->nRead); IOTRACE(("PGIN %p %d\n", pPager, pPg->pgno)); PAGERTRACE(("FETCH %d page %d hash(%08x)\n", PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); return rc; |
55219 55220 55221 55222 55223 55224 55225 | } *pPageSize = pPager->pageSize; if( rc==SQLITE_OK ){ if( nReserve<0 ) nReserve = pPager->nReserve; assert( nReserve>=0 && nReserve<1000 ); pPager->nReserve = (i16)nReserve; | < | 55325 55326 55327 55328 55329 55330 55331 55332 55333 55334 55335 55336 55337 55338 | } *pPageSize = pPager->pageSize; if( rc==SQLITE_OK ){ if( nReserve<0 ) nReserve = pPager->nReserve; assert( nReserve>=0 && nReserve<1000 ); pPager->nReserve = (i16)nReserve; pagerFixMaplimit(pPager); } return rc; } /* ** Return a pointer to the "temporary page" buffer held internally |
55615 55616 55617 55618 55619 55620 55621 | enable_simulated_io_errors(); PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); IOTRACE(("CLOSE %p\n", pPager)) sqlite3OsClose(pPager->jfd); sqlite3OsClose(pPager->fd); sqlite3PageFree(pTmp); sqlite3PcacheClose(pPager->pPCache); | < < < < < | 55720 55721 55722 55723 55724 55725 55726 55727 55728 55729 55730 55731 55732 55733 | enable_simulated_io_errors(); PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); IOTRACE(("CLOSE %p\n", pPager)) sqlite3OsClose(pPager->jfd); sqlite3OsClose(pPager->fd); sqlite3PageFree(pTmp); sqlite3PcacheClose(pPager->pPCache); assert( !pPager->aSavepoint && !pPager->pInJournal ); assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); sqlite3_free(pPager); return SQLITE_OK; } |
55870 55871 55872 55873 55874 55875 55876 | if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ char *pData; /* Data to write */ assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); if( pList->pgno==1 ) pager_write_changecounter(pList); | < | | 55970 55971 55972 55973 55974 55975 55976 55977 55978 55979 55980 55981 55982 55983 55984 | if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ char *pData; /* Data to write */ assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); if( pList->pgno==1 ) pager_write_changecounter(pList); pData = pList->pData; /* Write out the page data. */ rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); /* If page 1 was just written, update Pager.dbFileVers to match ** the value now stored in the database file. If writing this ** page caused the database file to grow, update dbFileSize. |
55960 55961 55962 55963 55964 55965 55966 | /* If the sub-journal was opened successfully (or was already open), ** write the journal record into the file. */ if( rc==SQLITE_OK ){ void *pData = pPg->pData; i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); char *pData2; | < < < < < < | 56059 56060 56061 56062 56063 56064 56065 56066 56067 56068 56069 56070 56071 56072 | /* If the sub-journal was opened successfully (or was already open), ** write the journal record into the file. */ if( rc==SQLITE_OK ){ void *pData = pPg->pData; i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); char *pData2; pData2 = pData; PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); rc = write32bits(pPager->sjfd, offset, pPg->pgno); if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); } } |
56238 56239 56240 56241 56242 56243 56244 56245 56246 56247 56248 56249 56250 56251 | ** file name. The layout in memory is as follows: ** ** Pager object (sizeof(Pager) bytes) ** PCache object (sqlite3PcacheSize() bytes) ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) ** \0\0\0\0 database prefix (4 bytes) ** Database file name (nPathname+1 bytes) ** URI query parameters (nUriByte bytes) ** Journal filename (nPathname+8+1 bytes) ** WAL filename (nPathname+4+1 bytes) ** \0\0\0 terminator (3 bytes) ** | > | 56331 56332 56333 56334 56335 56336 56337 56338 56339 56340 56341 56342 56343 56344 56345 | ** file name. The layout in memory is as follows: ** ** Pager object (sizeof(Pager) bytes) ** PCache object (sqlite3PcacheSize() bytes) ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) ** Ptr back to the Pager (sizeof(Pager*) bytes) ** \0\0\0\0 database prefix (4 bytes) ** Database file name (nPathname+1 bytes) ** URI query parameters (nUriByte bytes) ** Journal filename (nPathname+8+1 bytes) ** WAL filename (nPathname+4+1 bytes) ** \0\0\0 terminator (3 bytes) ** |
56266 56267 56268 56269 56270 56271 56272 56273 56274 56275 56276 56277 56278 56279 56280 56281 56282 56283 56284 56285 56286 56287 56288 56289 56290 56291 56292 56293 56294 56295 56296 56297 56298 56299 56300 56301 56302 56303 56304 56305 | ** - Value ** - \0 ** - \0 ** - Journal Path ** - \0 ** - WAL Path (zWALName) ** - \0 */ pPtr = (u8 *)sqlite3MallocZero( ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ 4 + /* Database prefix */ nPathname + 1 + /* database filename */ nUriByte + /* query parameters */ nPathname + 8 + 1 + /* Journal filename */ #ifndef SQLITE_OMIT_WAL nPathname + 4 + 1 + /* WAL filename */ #endif 3 /* Terminator */ ); assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ sqlite3DbFree(0, zPathname); return SQLITE_NOMEM_BKPT; } pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ pPtr += 4; /* Skip zero prefix */ pPager->zFilename = (char*)pPtr; if( nPathname>0 ){ memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; if( zUri ){ | > > > > > > > | 56360 56361 56362 56363 56364 56365 56366 56367 56368 56369 56370 56371 56372 56373 56374 56375 56376 56377 56378 56379 56380 56381 56382 56383 56384 56385 56386 56387 56388 56389 56390 56391 56392 56393 56394 56395 56396 56397 56398 56399 56400 56401 56402 56403 56404 56405 56406 | ** - Value ** - \0 ** - \0 ** - Journal Path ** - \0 ** - WAL Path (zWALName) ** - \0 ** ** The sqlite3_create_filename() interface and the databaseFilename() utility ** that is used by sqlite3_filename_database() and kin also depend on the ** specific formatting and order of the various filenames, so if the format ** changes here, be sure to change it there as well. */ pPtr = (u8 *)sqlite3MallocZero( ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ sizeof(pPager) + /* Space to hold a pointer */ 4 + /* Database prefix */ nPathname + 1 + /* database filename */ nUriByte + /* query parameters */ nPathname + 8 + 1 + /* Journal filename */ #ifndef SQLITE_OMIT_WAL nPathname + 4 + 1 + /* WAL filename */ #endif 3 /* Terminator */ ); assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ sqlite3DbFree(0, zPathname); return SQLITE_NOMEM_BKPT; } pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ pPtr += 4; /* Skip zero prefix */ pPager->zFilename = (char*)pPtr; if( nPathname>0 ){ memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; if( zUri ){ |
56492 56493 56494 56495 56496 56497 56498 56499 56500 56501 56502 56503 56504 56505 | /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ *ppPager = pPager; return SQLITE_OK; } /* ** This function is called after transitioning from PAGER_UNLOCK to ** PAGER_SHARED state. It tests if there is a hot journal present in ** the file-system for the given pager. A hot journal is one that ** needs to be played back. According to this function, a hot-journal | > > > > > > > > > > > > > | 56593 56594 56595 56596 56597 56598 56599 56600 56601 56602 56603 56604 56605 56606 56607 56608 56609 56610 56611 56612 56613 56614 56615 56616 56617 56618 56619 | /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ *ppPager = pPager; return SQLITE_OK; } /* ** Return the sqlite3_file for the main database given the name ** of the corresonding WAL or Journal name as passed into ** xOpen. */ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){ Pager *pPager; while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ zName--; } pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); return pPager->fd; } /* ** This function is called after transitioning from PAGER_UNLOCK to ** PAGER_SHARED state. It tests if there is a hot journal present in ** the file-system for the given pager. A hot journal is one that ** needs to be played back. According to this function, a hot-journal |
57047 57048 57049 57050 57051 57052 57053 | ** flag was specified by the caller. And so long as the db is not a ** temporary or in-memory database. */ const int bMmapOk = (pgno>1 && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) ); assert( USEFETCH(pPager) ); | < < < | 57161 57162 57163 57164 57165 57166 57167 57168 57169 57170 57171 57172 57173 57174 | ** flag was specified by the caller. And so long as the db is not a ** temporary or in-memory database. */ const int bMmapOk = (pgno>1 && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) ); assert( USEFETCH(pPager) ); /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here ** allows the compiler optimizer to reuse the results of the "pgno>1" ** test in the previous statement, and avoid testing pgno==0 in the ** common case where pgno is large. */ if( pgno<=1 && pgno==0 ){ return SQLITE_CORRUPT_BKPT; |
57180 57181 57182 57183 57184 57185 57186 | } SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ Pager *pPager; assert( pPg!=0 ); assert( pPg->pgno==1 ); assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ pPager = pPg->pPager; | < | 57291 57292 57293 57294 57295 57296 57297 57298 57299 57300 57301 57302 57303 57304 | } SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ Pager *pPager; assert( pPg!=0 ); assert( pPg->pgno==1 ); assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ pPager = pPg->pPager; sqlite3PcacheRelease(pPg); pagerUnlockIfUnused(pPager); } /* ** This function is called at the start of every write transaction. ** There must already be a RESERVED or EXCLUSIVE lock on the database |
57378 57379 57380 57381 57382 57383 57384 | /* We should never write to the journal file the page that ** contains the database locks. The following assert verifies ** that we do not. */ assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); assert( pPager->journalHdr<=pPager->journalOff ); | | | 57488 57489 57490 57491 57492 57493 57494 57495 57496 57497 57498 57499 57500 57501 57502 | /* We should never write to the journal file the page that ** contains the database locks. The following assert verifies ** that we do not. */ assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); assert( pPager->journalHdr<=pPager->journalOff ); pData2 = pPg->pData; cksum = pager_cksum(pPager, (u8*)pData2); /* Even if an IO or diskfull error occurs while journalling the ** page in the block above, set the need-sync flag for the page. ** Otherwise, when the transaction is rolled back, the logic in ** playback_one_page() will think that the page needs to be restored ** in the database file. And if an IO error occurs while doing so, |
57743 57744 57745 57746 57747 57748 57749 | /* Actually do the update of the change counter */ pager_write_changecounter(pPgHdr); /* If running in direct mode, write the contents of page 1 to the file. */ if( DIRECT_MODE ){ const void *zBuf; assert( pPager->dbFileSize>0 ); | | | 57853 57854 57855 57856 57857 57858 57859 57860 57861 57862 57863 57864 57865 57866 57867 | /* Actually do the update of the change counter */ pager_write_changecounter(pPgHdr); /* If running in direct mode, write the contents of page 1 to the file. */ if( DIRECT_MODE ){ const void *zBuf; assert( pPager->dbFileSize>0 ); zBuf = pPgHdr->pData; if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); pPager->aStat[PAGER_STAT_WRITE]++; } if( rc==SQLITE_OK ){ /* Update the pager's copy of the change-counter. Otherwise, the ** next time a read transaction is opened the cache will be |
58453 58454 58455 58456 58457 58458 58459 | ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can ** participate in shared-cache. ** ** The return value to this routine is always safe to use with ** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. */ SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 58563 58564 58565 58566 58567 58568 58569 58570 58571 58572 58573 58574 58575 58576 58577 58578 58579 58580 58581 58582 58583 58584 58585 58586 58587 58588 58589 58590 58591 58592 58593 58594 58595 58596 58597 58598 58599 58600 58601 58602 58603 58604 58605 58606 58607 58608 58609 58610 58611 58612 58613 58614 58615 | ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can ** participate in shared-cache. ** ** The return value to this routine is always safe to use with ** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. */ SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ static const char zFake[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename; } /* ** Return the VFS structure for the pager. */ SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ return pPager->pVfs; } /* ** Return the file handle for the database file associated ** with the pager. This might return NULL if the file has ** not yet been opened. */ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ return pPager->fd; } /* ** Return the file handle for the journal file (if it exists). ** This will be either the rollback journal or the WAL file. */ SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ #if SQLITE_OMIT_WAL return pPager->jfd; #else return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; #endif } /* ** Return the full pathname of the journal file. */ SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ return pPager->zJournal; } #ifndef SQLITE_OMIT_AUTOVACUUM /* ** Move the page pPg to location pgno in the file. ** ** There must be no references to the page previously located at ** pgno (which we call pPgOld) though that page is allowed to be ** in cache. If the page previously located at pgno is not already |
58944 58945 58946 58947 58948 58949 58950 | if( pPager->pWal ){ rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), pPager->pBusyHandlerArg, pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt ); | < | 58996 58997 58998 58999 59000 59001 59002 59003 59004 59005 59006 59007 59008 59009 | if( pPager->pWal ){ rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), pPager->pBusyHandlerArg, pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt ); } return rc; } SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ return sqlite3WalCallback(pPager->pWal); } |
59109 59110 59111 59112 59113 59114 59115 | pagerFixMaplimit(pPager); if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); } } return rc; } | > > > > > > > > > > > | > > > > > > > > > > > > > | > > > | 59160 59161 59162 59163 59164 59165 59166 59167 59168 59169 59170 59171 59172 59173 59174 59175 59176 59177 59178 59179 59180 59181 59182 59183 59184 59185 59186 59187 59188 59189 59190 59191 59192 59193 59194 59195 59196 59197 59198 59199 59200 59201 59202 59203 59204 59205 59206 59207 59208 59209 59210 59211 59212 59213 59214 59215 59216 59217 59218 59219 59220 59221 | pagerFixMaplimit(pPager); if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); } } return rc; } #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* ** If pager pPager is a wal-mode database not in exclusive locking mode, ** invoke the sqlite3WalWriteLock() function on the associated Wal object ** with the same db and bLock parameters as were passed to this function. ** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. */ SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ int rc = SQLITE_OK; if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ rc = sqlite3WalWriteLock(pPager->pWal, bLock); } return rc; } /* ** Set the database handle used by the wal layer to determine if ** blocking locks are required. */ SQLITE_PRIVATE void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ if( pagerUseWal(pPager) ){ sqlite3WalDb(pPager->pWal, db); } } #endif #ifdef SQLITE_ENABLE_SNAPSHOT /* ** If this is a WAL database, obtain a snapshot handle for the snapshot ** currently open. Otherwise, return an error. */ SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ int rc = SQLITE_ERROR; if( pPager->pWal ){ rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); } return rc; } /* ** If this is a WAL database, store a pointer to pSnapshot. Next time a ** read transaction is opened, attempt to read from the snapshot it ** identifies. If this is not a WAL database, return an error. */ SQLITE_PRIVATE int sqlite3PagerSnapshotOpen( Pager *pPager, sqlite3_snapshot *pSnapshot ){ int rc = SQLITE_OK; if( pPager->pWal ){ sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); }else{ rc = SQLITE_ERROR; } return rc; |
59465 59466 59467 59468 59469 59470 59471 | #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) SQLITE_PRIVATE int sqlite3WalTrace = 0; # define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X #else # define WALTRACE(X) #endif | < < < < < < < < < < < < | 59543 59544 59545 59546 59547 59548 59549 59550 59551 59552 59553 59554 59555 59556 | #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) SQLITE_PRIVATE int sqlite3WalTrace = 0; # define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X #else # define WALTRACE(X) #endif /* ** The maximum (and only) versions of the wal and wal-index formats ** that may be interpreted by this version of SQLite. ** ** If a client begins recovering a WAL file and finds that (a) the checksum ** values in the wal-header are correct and (b) the version field is not ** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN. |
59686 59687 59688 59689 59690 59691 59692 59693 59694 59695 59696 59697 59698 59699 | u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ #ifdef SQLITE_DEBUG u8 lockError; /* True if a locking error has occurred */ #endif #ifdef SQLITE_ENABLE_SNAPSHOT WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ #endif }; /* ** Candidate values for Wal.exclusiveMode. */ #define WAL_NORMAL_MODE 0 #define WAL_EXCLUSIVE_MODE 1 | > > > | 59752 59753 59754 59755 59756 59757 59758 59759 59760 59761 59762 59763 59764 59765 59766 59767 59768 | u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ #ifdef SQLITE_DEBUG u8 lockError; /* True if a locking error has occurred */ #endif #ifdef SQLITE_ENABLE_SNAPSHOT WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ #endif #ifdef SQLITE_ENABLE_SETLK_TIMEOUT sqlite3 *db; #endif }; /* ** Candidate values for Wal.exclusiveMode. */ #define WAL_NORMAL_MODE 0 #define WAL_EXCLUSIVE_MODE 1 |
59784 59785 59786 59787 59788 59789 59790 | ){ int rc = SQLITE_OK; /* Enlarge the pWal->apWiData[] array if required */ if( pWal->nWiData<=iPage ){ sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; | | | 59853 59854 59855 59856 59857 59858 59859 59860 59861 59862 59863 59864 59865 59866 59867 | ){ int rc = SQLITE_OK; /* Enlarge the pWal->apWiData[] array if required */ if( pWal->nWiData<=iPage ){ sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); if( !apNew ){ *ppPage = 0; return SQLITE_NOMEM_BKPT; } memset((void*)&apNew[pWal->nWiData], 0, sizeof(u32*)*(iPage+1-pWal->nWiData)); pWal->apWiData = apNew; |
59905 59906 59907 59908 59909 59910 59911 59912 59913 59914 59915 59916 59917 59918 59919 59920 59921 59922 | }while( aData<aEnd ); } aOut[0] = s1; aOut[1] = s2; } static void walShmBarrier(Wal *pWal){ if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ sqlite3OsShmBarrier(pWal->pDbFd); } } /* ** Write the header information in pWal->hdr into the wal-index. ** ** The checksum on pWal->hdr is updated before it is written. */ | > > > > > > > > > > > > > > > > > | > | 59974 59975 59976 59977 59978 59979 59980 59981 59982 59983 59984 59985 59986 59987 59988 59989 59990 59991 59992 59993 59994 59995 59996 59997 59998 59999 60000 60001 60002 60003 60004 60005 60006 60007 60008 60009 60010 60011 60012 60013 60014 60015 60016 60017 60018 60019 60020 60021 60022 60023 60024 | }while( aData<aEnd ); } aOut[0] = s1; aOut[1] = s2; } /* ** If there is the possibility of concurrent access to the SHM file ** from multiple threads and/or processes, then do a memory barrier. */ static void walShmBarrier(Wal *pWal){ if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ sqlite3OsShmBarrier(pWal->pDbFd); } } /* ** Add the SQLITE_NO_TSAN as part of the return-type of a function ** definition as a hint that the function contains constructs that ** might give false-positive TSAN warnings. ** ** See tag-20200519-1. */ #if defined(__clang__) && !defined(SQLITE_NO_TSAN) # define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) #else # define SQLITE_NO_TSAN #endif /* ** Write the header information in pWal->hdr into the wal-index. ** ** The checksum on pWal->hdr is updated before it is written. */ static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ volatile WalIndexHdr *aHdr = walIndexHdr(pWal); const int nCksum = offsetof(WalIndexHdr, aCksum); assert( pWal->writeLock ); pWal->hdr.isInit = 1; pWal->hdr.iVersion = WALINDEX_MAX_VERSION; walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); /* Possible TSAN false-positive. See tag-20200519-1 */ memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); walShmBarrier(pWal); memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); } /* ** This function encodes a single frame header and writes it to a buffer |
60059 60060 60061 60062 60063 60064 60065 | static int walLockShared(Wal *pWal, int lockIdx){ int rc; if( pWal->exclusiveMode ) return SQLITE_OK; rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, walLockName(lockIdx), rc ? "failed" : "ok")); | | | | 60146 60147 60148 60149 60150 60151 60152 60153 60154 60155 60156 60157 60158 60159 60160 60161 60162 60163 60164 60165 60166 60167 60168 60169 60170 60171 60172 60173 60174 60175 60176 | static int walLockShared(Wal *pWal, int lockIdx){ int rc; if( pWal->exclusiveMode ) return SQLITE_OK; rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, walLockName(lockIdx), rc ? "failed" : "ok")); VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) return rc; } static void walUnlockShared(Wal *pWal, int lockIdx){ if( pWal->exclusiveMode ) return; (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED); WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); } static int walLockExclusive(Wal *pWal, int lockIdx, int n){ int rc; if( pWal->exclusiveMode ) return SQLITE_OK; rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE); WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, walLockName(lockIdx), n, rc ? "failed" : "ok")); VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) return rc; } static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ if( pWal->exclusiveMode ) return; (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE); WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal, |
60894 60895 60896 60897 60898 60899 60900 60901 60902 60903 60904 60905 60906 60907 60908 60909 60910 60911 60912 60913 60914 60915 60916 60917 60918 60919 60920 60921 60922 60923 60924 60925 | if( rc!=SQLITE_OK ){ walIteratorFree(p); p = 0; } *pp = p; return rc; } /* ** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and ** n. If the attempt fails and parameter xBusy is not NULL, then it is a ** busy-handler function. Invoke it and retry the lock until either the ** lock is successfully obtained or the busy-handler returns 0. */ static int walBusyLock( Wal *pWal, /* WAL connection */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ int lockIdx, /* Offset of first byte to lock */ int n /* Number of bytes to lock */ ){ int rc; do { rc = walLockExclusive(pWal, lockIdx, n); }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); return rc; } /* ** The cache of the wal-index header must be valid to call this function. ** Return the page-size in bytes used by the database. */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 60981 60982 60983 60984 60985 60986 60987 60988 60989 60990 60991 60992 60993 60994 60995 60996 60997 60998 60999 61000 61001 61002 61003 61004 61005 61006 61007 61008 61009 61010 61011 61012 61013 61014 61015 61016 61017 61018 61019 61020 61021 61022 61023 61024 61025 61026 61027 61028 61029 61030 61031 61032 61033 61034 61035 61036 61037 61038 61039 61040 61041 61042 61043 61044 61045 61046 61047 61048 61049 61050 61051 61052 61053 61054 61055 61056 61057 61058 61059 61060 61061 61062 61063 61064 61065 61066 61067 61068 61069 61070 61071 61072 61073 61074 61075 61076 61077 61078 61079 61080 61081 61082 61083 61084 61085 61086 61087 61088 61089 61090 61091 61092 61093 61094 61095 61096 61097 61098 61099 61100 61101 | if( rc!=SQLITE_OK ){ walIteratorFree(p); p = 0; } *pp = p; return rc; } #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* ** Attempt to enable blocking locks. Blocking locks are enabled only if (a) ** they are supported by the VFS, and (b) the database handle is configured ** with a busy-timeout. Return 1 if blocking locks are successfully enabled, ** or 0 otherwise. */ static int walEnableBlocking(Wal *pWal){ int res = 0; if( pWal->db ){ int tmout = pWal->db->busyTimeout; if( tmout ){ int rc; rc = sqlite3OsFileControl( pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout ); res = (rc==SQLITE_OK); } } return res; } /* ** Disable blocking locks. */ static void walDisableBlocking(Wal *pWal){ int tmout = 0; sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); } /* ** If parameter bLock is true, attempt to enable blocking locks, take ** the WRITER lock, and then disable blocking locks. If blocking locks ** cannot be enabled, no attempt to obtain the WRITER lock is made. Return ** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not ** an error if blocking locks can not be enabled. ** ** If the bLock parameter is false and the WRITER lock is held, release it. */ SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock){ int rc = SQLITE_OK; assert( pWal->readLock<0 || bLock==0 ); if( bLock ){ assert( pWal->db ); if( walEnableBlocking(pWal) ){ rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); if( rc==SQLITE_OK ){ pWal->writeLock = 1; } walDisableBlocking(pWal); } }else if( pWal->writeLock ){ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; } return rc; } /* ** Set the database handle used to determine if blocking locks are required. */ SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db){ pWal->db = db; } /* ** Take an exclusive WRITE lock. Blocking if so configured. */ static int walLockWriter(Wal *pWal){ int rc; walEnableBlocking(pWal); rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); walDisableBlocking(pWal); return rc; } #else # define walEnableBlocking(x) 0 # define walDisableBlocking(x) # define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) # define sqlite3WalDb(pWal, db) #endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ /* ** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and ** n. If the attempt fails and parameter xBusy is not NULL, then it is a ** busy-handler function. Invoke it and retry the lock until either the ** lock is successfully obtained or the busy-handler returns 0. */ static int walBusyLock( Wal *pWal, /* WAL connection */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ int lockIdx, /* Offset of first byte to lock */ int n /* Number of bytes to lock */ ){ int rc; do { rc = walLockExclusive(pWal, lockIdx, n); }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT if( rc==SQLITE_BUSY_TIMEOUT ){ walDisableBlocking(pWal); rc = SQLITE_BUSY; } #endif return rc; } /* ** The cache of the wal-index header must be valid to call this function. ** Return the page-size in bytes used by the database. */ |
60949 60950 60951 60952 60953 60954 60955 | int i; /* Loop counter */ u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ pWal->nCkpt++; pWal->hdr.mxFrame = 0; sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); memcpy(&pWal->hdr.aSalt[1], &salt1, 4); walIndexWriteHdr(pWal); | | | 61125 61126 61127 61128 61129 61130 61131 61132 61133 61134 61135 61136 61137 61138 61139 | int i; /* Loop counter */ u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ pWal->nCkpt++; pWal->hdr.mxFrame = 0; sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); memcpy(&pWal->hdr.aSalt[1], &salt1, 4); walIndexWriteHdr(pWal); AtomicStore(&pInfo->nBackfill, 0); pInfo->nBackfillAttempted = 0; pInfo->aReadMark[1] = 0; for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED; assert( pInfo->aReadMark[0]==0 ); } /* |
61024 61025 61026 61027 61028 61029 61030 | ** safe to write into the database. Frames beyond mxSafeFrame might ** overwrite database pages that are in use by active readers and thus ** cannot be backfilled from the WAL. */ mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; for(i=1; i<WAL_NREADER; i++){ | < < < < < < < < < < < < < < < < < < < < | | > | > | > < < < < | | 61200 61201 61202 61203 61204 61205 61206 61207 61208 61209 61210 61211 61212 61213 61214 61215 61216 61217 61218 61219 61220 61221 61222 61223 61224 61225 61226 61227 61228 61229 61230 61231 61232 61233 61234 61235 61236 61237 61238 61239 61240 61241 61242 61243 61244 61245 61246 61247 61248 61249 61250 61251 61252 61253 61254 61255 61256 61257 61258 61259 61260 61261 61262 61263 61264 61265 61266 61267 61268 61269 61270 61271 61272 61273 61274 61275 61276 61277 61278 61279 61280 61281 61282 61283 61284 61285 61286 61287 61288 61289 61290 61291 61292 61293 61294 | ** safe to write into the database. Frames beyond mxSafeFrame might ** overwrite database pages that are in use by active readers and thus ** cannot be backfilled from the WAL. */ mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; for(i=1; i<WAL_NREADER; i++){ u32 y = AtomicLoad(pInfo->aReadMark+i); if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ u32 iMark = (i==1 ? mxSafeFrame : READMARK_NOT_USED); AtomicStore(pInfo->aReadMark+i, iMark); walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); }else if( rc==SQLITE_BUSY ){ mxSafeFrame = y; xBusy = 0; }else{ goto walcheckpoint_out; } } } /* Allocate the iterator */ if( pInfo->nBackfill<mxSafeFrame ){ rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter); assert( rc==SQLITE_OK || pIter==0 ); } if( pIter && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK ){ u32 nBackfill = pInfo->nBackfill; pInfo->nBackfillAttempted = mxSafeFrame; /* Sync the WAL to disk */ rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); /* If the database may grow as a result of this checkpoint, hint ** about the eventual size of the db file to the VFS layer. */ if( rc==SQLITE_OK ){ i64 nReq = ((i64)mxPage * szPage); i64 nSize; /* Current size of database file */ sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); if( rc==SQLITE_OK && nSize<nReq ){ sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); } } /* Iterate through the contents of the WAL, copying data to the db file */ while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ i64 iOffset; assert( walFramePgno(pWal, iFrame)==iDbpage ); if( AtomicLoad(&db->u1.isInterrupted) ){ rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; break; } if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ continue; } iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); if( rc!=SQLITE_OK ) break; iOffset = (iDbpage-1)*(i64)szPage; testcase( IS_BIG_INT(iOffset) ); rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); if( rc!=SQLITE_OK ) break; } sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); /* If work was actually accomplished... */ if( rc==SQLITE_OK ){ if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ i64 szDb = pWal->hdr.nPage*(i64)szPage; testcase( IS_BIG_INT(szDb) ); rc = sqlite3OsTruncate(pWal->pDbFd, szDb); if( rc==SQLITE_OK ){ rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); } } if( rc==SQLITE_OK ){ AtomicStore(&pInfo->nBackfill, mxSafeFrame); } } /* Release the reader lock held while backfilling */ walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); } |
61284 61285 61286 61287 61288 61289 61290 | ** If and only if the read is consistent and the header is different from ** pWal->hdr, then pWal->hdr is updated to the content of the new header ** and *pChanged is set to 1. ** ** If the checksum cannot be verified return non-zero. If the header ** is read successfully and the checksum verified, return zero. */ | | > | > > > > > | | 61439 61440 61441 61442 61443 61444 61445 61446 61447 61448 61449 61450 61451 61452 61453 61454 61455 61456 61457 61458 61459 61460 61461 61462 61463 61464 61465 61466 61467 61468 61469 61470 61471 61472 61473 61474 61475 61476 61477 61478 | ** If and only if the read is consistent and the header is different from ** pWal->hdr, then pWal->hdr is updated to the content of the new header ** and *pChanged is set to 1. ** ** If the checksum cannot be verified return non-zero. If the header ** is read successfully and the checksum verified, return zero. */ static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ u32 aCksum[2]; /* Checksum on the header content */ WalIndexHdr h1, h2; /* Two copies of the header content */ WalIndexHdr volatile *aHdr; /* Header in shared memory */ /* The first page of the wal-index must be mapped at this point. */ assert( pWal->nWiData>0 && pWal->apWiData[0] ); /* Read the header. This might happen concurrently with a write to the ** same area of shared memory on a different CPU in a SMP, ** meaning it is possible that an inconsistent snapshot is read ** from the file. If this happens, return non-zero. ** ** tag-20200519-1: ** There are two copies of the header at the beginning of the wal-index. ** When reading, read [0] first then [1]. Writes are in the reverse order. ** Memory barriers are used to prevent the compiler or the hardware from ** reordering the reads and writes. TSAN and similar tools can sometimes ** give false-positive warnings about these accesses because the tools do not ** account for the double-read and the memory barrier. The use of mutexes ** here would be problematic as the memory being accessed is potentially ** shared among multiple processes and not all mutex implementions work ** reliably in that environment. */ aHdr = walIndexHdr(pWal); memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ walShmBarrier(pWal); memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ return 1; /* Dirty read */ } if( h1.isInit==0 ){ |
61393 61394 61395 61396 61397 61398 61399 | ** being modified by another thread or process. */ badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); /* If the first attempt failed, it might have been due to a race ** with a writer. So get a WRITE lock and try again. */ | < > > | | | | | | | | | | | | | > | | > > | 61554 61555 61556 61557 61558 61559 61560 61561 61562 61563 61564 61565 61566 61567 61568 61569 61570 61571 61572 61573 61574 61575 61576 61577 61578 61579 61580 61581 61582 61583 61584 61585 61586 61587 61588 61589 61590 61591 61592 61593 | ** being modified by another thread or process. */ badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); /* If the first attempt failed, it might have been due to a race ** with a writer. So get a WRITE lock and try again. */ if( badHdr ){ if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ walUnlockShared(pWal, WAL_WRITE_LOCK); rc = SQLITE_READONLY_RECOVERY; } }else{ int bWriteLock = pWal->writeLock; if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ pWal->writeLock = 1; if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ badHdr = walIndexTryHdr(pWal, pChanged); if( badHdr ){ /* If the wal-index header is still malformed even while holding ** a WRITE lock, it can only mean that the header is corrupted and ** needs to be reconstructed. So run recovery to do exactly that. */ rc = walIndexRecover(pWal); *pChanged = 1; } } if( bWriteLock==0 ){ pWal->writeLock = 0; walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); } } } } /* If the header is read successfully, check the version number to make ** sure the wal-index was not constructed with some future format that ** this version of SQLite cannot understand. */ |
61744 61745 61746 61747 61748 61749 61750 | return walBeginShmUnreliable(pWal, pChanged); } } assert( pWal->nWiData>0 ); assert( pWal->apWiData[0]!=0 ); pInfo = walCkptInfo(pWal); | | | 61909 61910 61911 61912 61913 61914 61915 61916 61917 61918 61919 61920 61921 61922 61923 | return walBeginShmUnreliable(pWal, pChanged); } } assert( pWal->nWiData>0 ); assert( pWal->apWiData[0]!=0 ); pInfo = walCkptInfo(pWal); if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame #ifdef SQLITE_ENABLE_SNAPSHOT && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) #endif ){ /* The WAL has been completely backfilled (or it is empty). ** and can be safely ignored. */ |
61806 61807 61808 61809 61810 61811 61812 | } if( (pWal->readOnly & WAL_SHM_RDONLY)==0 && (mxReadMark<mxFrame || mxI==0) ){ for(i=1; i<WAL_NREADER; i++){ rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ | | > | 61971 61972 61973 61974 61975 61976 61977 61978 61979 61980 61981 61982 61983 61984 61985 61986 | } if( (pWal->readOnly & WAL_SHM_RDONLY)==0 && (mxReadMark<mxFrame || mxI==0) ){ for(i=1; i<WAL_NREADER; i++){ rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ AtomicStore(pInfo->aReadMark+i,mxFrame); mxReadMark = mxFrame; mxI = i; walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); break; }else if( rc!=SQLITE_BUSY ){ return rc; } } |
61910 61911 61912 61913 61914 61915 61916 | if( rc==SQLITE_OK ){ void *pBuf1 = sqlite3_malloc(szPage); void *pBuf2 = sqlite3_malloc(szPage); if( pBuf1==0 || pBuf2==0 ){ rc = SQLITE_NOMEM; }else{ u32 i = pInfo->nBackfillAttempted; | | | 62076 62077 62078 62079 62080 62081 62082 62083 62084 62085 62086 62087 62088 62089 62090 | if( rc==SQLITE_OK ){ void *pBuf1 = sqlite3_malloc(szPage); void *pBuf2 = sqlite3_malloc(szPage); if( pBuf1==0 || pBuf2==0 ){ rc = SQLITE_NOMEM; }else{ u32 i = pInfo->nBackfillAttempted; for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ WalHashLoc sLoc; /* Hash table location */ u32 pgno; /* Page number in db file */ i64 iDbOff; /* Offset of db file entry */ i64 iWalOff; /* Offset of wal file entry */ rc = walHashGet(pWal, walFramePage(i), &sLoc); if( rc!=SQLITE_OK ) break; |
61966 61967 61968 61969 61970 61971 61972 61973 61974 61975 | ** Pager layer will use this to know that its cache is stale and ** needs to be flushed. */ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ #ifdef SQLITE_ENABLE_SNAPSHOT int bChanged = 0; WalIndexHdr *pSnapshot = pWal->pSnapshot; | > > > | | > > > > > > > > > > > > > > > > > > | 62132 62133 62134 62135 62136 62137 62138 62139 62140 62141 62142 62143 62144 62145 62146 62147 62148 62149 62150 62151 62152 62153 62154 62155 62156 62157 62158 62159 62160 62161 62162 62163 62164 62165 62166 62167 62168 62169 62170 62171 | ** Pager layer will use this to know that its cache is stale and ** needs to be flushed. */ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ assert( pWal->ckptLock==0 ); #ifdef SQLITE_ENABLE_SNAPSHOT int bChanged = 0; WalIndexHdr *pSnapshot = pWal->pSnapshot; if( pSnapshot ){ if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ bChanged = 1; } /* It is possible that there is a checkpointer thread running ** concurrent with this code. If this is the case, it may be that the ** checkpointer has already determined that it will checkpoint ** snapshot X, where X is later in the wal file than pSnapshot, but ** has not yet set the pInfo->nBackfillAttempted variable to indicate ** its intent. To avoid the race condition this leads to, ensure that ** there is no checkpointer process by taking a shared CKPT lock ** before checking pInfo->nBackfillAttempted. */ (void)walEnableBlocking(pWal); rc = walLockShared(pWal, WAL_CKPT_LOCK); walDisableBlocking(pWal); if( rc!=SQLITE_OK ){ return rc; } pWal->ckptLock = 1; } #endif do{ rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); }while( rc==WAL_RETRY ); testcase( (rc&0xff)==SQLITE_BUSY ); |
62003 62004 62005 62006 62007 62008 62009 | ** checkpoint need not have completed for this to cause problems. */ volatile WalCkptInfo *pInfo = walCkptInfo(pWal); assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); | < < < < < < < < < < < < < < < | | | | | | | | | | | | | | | > > > > > | < | < < > > > > > > > | 62190 62191 62192 62193 62194 62195 62196 62197 62198 62199 62200 62201 62202 62203 62204 62205 62206 62207 62208 62209 62210 62211 62212 62213 62214 62215 62216 62217 62218 62219 62220 62221 62222 62223 62224 62225 62226 62227 62228 62229 62230 62231 62232 62233 62234 62235 62236 62237 62238 62239 | ** checkpoint need not have completed for this to cause problems. */ volatile WalCkptInfo *pInfo = walCkptInfo(pWal); assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); /* Check that the wal file has not been wrapped. Assuming that it has ** not, also check that no checkpointer has attempted to checkpoint any ** frames beyond pSnapshot->mxFrame. If either of these conditions are ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr ** with *pSnapshot and set *pChanged as appropriate for opening the ** snapshot. */ if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) && pSnapshot->mxFrame>=pInfo->nBackfillAttempted ){ assert( pWal->readLock>0 ); memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); *pChanged = bChanged; }else{ rc = SQLITE_ERROR_SNAPSHOT; } /* A client using a non-current snapshot may not ignore any frames ** from the start of the wal file. This is because, for a system ** where (minFrame < iSnapshot < maxFrame), a checkpointer may ** have omitted to checkpoint a frame earlier than minFrame in ** the file because there exists a frame after iSnapshot that ** is the same database page. */ pWal->minFrame = 1; if( rc!=SQLITE_OK ){ sqlite3WalEndReadTransaction(pWal); } } } /* Release the shared CKPT lock obtained above. */ if( pWal->ckptLock ){ assert( pSnapshot ); walUnlockShared(pWal, WAL_CKPT_LOCK); pWal->ckptLock = 0; } #endif return rc; } /* ** Finish with a read transaction. All this does is release the ** read-lock. |
62124 62125 62126 62127 62128 62129 62130 62131 62132 62133 62134 62135 62136 | */ iMinHash = walFramePage(pWal->minFrame); for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){ WalHashLoc sLoc; /* Hash table location */ int iKey; /* Hash slot index */ int nCollide; /* Number of hash collisions remaining */ int rc; /* Error code */ rc = walHashGet(pWal, iHash, &sLoc); if( rc!=SQLITE_OK ){ return rc; } nCollide = HASHTABLE_NSLOT; | > | | > | 62305 62306 62307 62308 62309 62310 62311 62312 62313 62314 62315 62316 62317 62318 62319 62320 62321 62322 62323 62324 62325 62326 62327 62328 62329 62330 62331 62332 62333 62334 62335 62336 | */ iMinHash = walFramePage(pWal->minFrame); for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){ WalHashLoc sLoc; /* Hash table location */ int iKey; /* Hash slot index */ int nCollide; /* Number of hash collisions remaining */ int rc; /* Error code */ u32 iH; rc = walHashGet(pWal, iHash, &sLoc); if( rc!=SQLITE_OK ){ return rc; } nCollide = HASHTABLE_NSLOT; iKey = walHash(pgno); while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ u32 iFrame = iH + sLoc.iZero; if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); iRead = iFrame; } if( (nCollide--)==0 ){ return SQLITE_CORRUPT_BKPT; } iKey = walNextHash(iKey); } if( iRead ) break; } #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* If expensive assert() statements are available, do a linear search ** of the wal-index file content. Make sure the results agree with the |
62214 62215 62216 62217 62218 62219 62220 62221 62222 62223 62224 62225 62226 62227 | ** thread to write as doing so would cause a fork. So this routine ** returns SQLITE_BUSY in that case and no write transaction is started. ** ** There can only be a single writer active at a time. */ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ int rc; /* Cannot start a write transaction without first holding a read ** transaction. */ assert( pWal->readLock>=0 ); assert( pWal->writeLock==0 && pWal->iReCksum==0 ); if( pWal->readOnly ){ | > > > > > > > > > > | 62397 62398 62399 62400 62401 62402 62403 62404 62405 62406 62407 62408 62409 62410 62411 62412 62413 62414 62415 62416 62417 62418 62419 62420 | ** thread to write as doing so would cause a fork. So this routine ** returns SQLITE_BUSY in that case and no write transaction is started. ** ** There can only be a single writer active at a time. */ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ int rc; #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* If the write-lock is already held, then it was obtained before the ** read-transaction was even opened, making this call a no-op. ** Return early. */ if( pWal->writeLock ){ assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) ); return SQLITE_OK; } #endif /* Cannot start a write transaction without first holding a read ** transaction. */ assert( pWal->readLock>=0 ); assert( pWal->writeLock==0 && pWal->iReCksum==0 ); if( pWal->readOnly ){ |
62460 62461 62462 62463 62464 62465 62466 | PgHdr *pPage, /* The page of the frame to be written */ int nTruncate, /* The commit flag. Usually 0. >0 for commit */ sqlite3_int64 iOffset /* Byte offset at which to write */ ){ int rc; /* Result code from subfunctions */ void *pData; /* Data actually written */ u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ | < < < < | 62653 62654 62655 62656 62657 62658 62659 62660 62661 62662 62663 62664 62665 62666 62667 | PgHdr *pPage, /* The page of the frame to be written */ int nTruncate, /* The commit flag. Usually 0. >0 for commit */ sqlite3_int64 iOffset /* Byte offset at which to write */ ){ int rc; /* Result code from subfunctions */ void *pData; /* Data actually written */ u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ pData = pPage->pData; walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); if( rc ) return rc; /* Write the page data */ rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); return rc; } |
62647 62648 62649 62650 62651 62652 62653 | assert( rc==SQLITE_OK || iWrite==0 ); if( iWrite>=iFirst ){ i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; void *pData; if( pWal->iReCksum==0 || iWrite<pWal->iReCksum ){ pWal->iReCksum = iWrite; } | < < < < | 62836 62837 62838 62839 62840 62841 62842 62843 62844 62845 62846 62847 62848 62849 62850 | assert( rc==SQLITE_OK || iWrite==0 ); if( iWrite>=iFirst ){ i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; void *pData; if( pWal->iReCksum==0 || iWrite<pWal->iReCksum ){ pWal->iReCksum = iWrite; } pData = p->pData; rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); if( rc ) return rc; p->flags &= ~PGHDR_WAL_APPEND; continue; } } |
62798 62799 62800 62801 62802 62803 62804 62805 62806 | /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive | > > > > > | > > > > > > < < < < < < < | | | < | | | | | | | | | | | | | | | | | | | | | > > > > | 62983 62984 62985 62986 62987 62988 62989 62990 62991 62992 62993 62994 62995 62996 62997 62998 62999 63000 63001 63002 63003 63004 63005 63006 63007 63008 63009 63010 63011 63012 63013 63014 63015 63016 63017 63018 63019 63020 63021 63022 63023 63024 63025 63026 63027 63028 63029 63030 63031 63032 63033 63034 63035 63036 63037 63038 63039 63040 63041 63042 63043 | /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); /* Enable blocking locks, if possible. If blocking locks are successfully ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ sqlite3WalDb(pWal, db); (void)walEnableBlocking(pWal); /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. ** EVIDENCE-OF: R-10421-19736 If any other process is running a ** checkpoint operation at the same time, the lock cannot be obtained and ** SQLITE_BUSY is returned. ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, ** it will not be invoked in this case. */ rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); testcase( rc==SQLITE_BUSY ); testcase( rc!=SQLITE_OK && xBusy2!=0 ); if( rc==SQLITE_OK ){ pWal->ckptLock = 1; /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and ** TRUNCATE modes also obtain the exclusive "writer" lock on the database ** file. ** ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained ** immediately, and a busy-handler is configured, it is invoked and the ** writer lock retried until either the busy-handler returns 0 or the ** lock is successfully obtained. */ if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); if( rc==SQLITE_OK ){ pWal->writeLock = 1; }else if( rc==SQLITE_BUSY ){ eMode2 = SQLITE_CHECKPOINT_PASSIVE; xBusy2 = 0; rc = SQLITE_OK; } } } /* Read the wal-index header. */ if( rc==SQLITE_OK ){ walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); (void)walEnableBlocking(pWal); if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ sqlite3OsUnfetch(pWal->pDbFd, 0, 0); } } /* Copy data from the log to the database file. */ if( rc==SQLITE_OK ){ |
62868 62869 62870 62871 62872 62873 62874 62875 62876 62877 | ** performed, then the pager-cache associated with pWal is now ** out of date. So zero the cached wal-index header to ensure that ** next time the pager opens a snapshot on this database it knows that ** the cache needs to be reset. */ memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); } /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); | > > > > | | > > > > | 63060 63061 63062 63063 63064 63065 63066 63067 63068 63069 63070 63071 63072 63073 63074 63075 63076 63077 63078 63079 63080 63081 63082 63083 63084 63085 63086 63087 | ** performed, then the pager-cache associated with pWal is now ** out of date. So zero the cached wal-index header to ensure that ** next time the pager opens a snapshot on this database it knows that ** the cache needs to be reset. */ memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); } walDisableBlocking(pWal); sqlite3WalDb(pWal, 0); /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); if( pWal->ckptLock ){ walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); pWal->ckptLock = 0; } WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; #endif return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); } /* Return the value to pass to a sqlite3_wal_hook callback, the ** number of frames in the WAL at the point of the last commit since ** sqlite3WalCallback() was called. If no commits have occurred since ** the last call, then return 0. |
62990 62991 62992 62993 62994 62995 62996 | } return rc; } /* Try to open on pSnapshot when the next read-transaction starts */ | | > > > | 63190 63191 63192 63193 63194 63195 63196 63197 63198 63199 63200 63201 63202 63203 63204 63205 63206 63207 | } return rc; } /* Try to open on pSnapshot when the next read-transaction starts */ SQLITE_PRIVATE void sqlite3WalSnapshotOpen( Wal *pWal, sqlite3_snapshot *pSnapshot ){ pWal->pSnapshot = (WalIndexHdr*)pSnapshot; } /* ** Return a +ve value if snapshot p1 is newer than p2. A -ve value if ** p1 is older than p2 and zero if p1 and p2 are the same snapshot. */ |
63509 63510 63511 63512 63513 63514 63515 | #ifndef SQLITE_OMIT_AUTOVACUUM u8 autoVacuum; /* True if auto-vacuum is enabled */ u8 incrVacuum; /* True if incr-vacuum is enabled */ u8 bDoTruncate; /* True to truncate db on commit */ #endif u8 inTransaction; /* Transaction state */ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ | < | < | 63712 63713 63714 63715 63716 63717 63718 63719 63720 63721 63722 63723 63724 63725 63726 | #ifndef SQLITE_OMIT_AUTOVACUUM u8 autoVacuum; /* True if auto-vacuum is enabled */ u8 incrVacuum; /* True if incr-vacuum is enabled */ u8 bDoTruncate; /* True to truncate db on commit */ #endif u8 inTransaction; /* Transaction state */ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ u8 nReserveWanted; /* Desired number of extra bytes per page */ u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ u16 minLeaf; /* Minimum local payload in a LEAFDATA table */ u32 pageSize; /* Total number of bytes on a page */ u32 usableSize; /* Number of usable bytes on each page */ |
64712 64713 64714 64715 64716 64717 64718 | ** ** This function is called when a free-list leaf page is removed from the ** free-list for reuse. It returns false if it is safe to retrieve the ** page from the pager layer with the 'no-content' flag set. True otherwise. */ static int btreeGetHasContent(BtShared *pBt, Pgno pgno){ Bitvec *p = pBt->pHasContent; | | | 64913 64914 64915 64916 64917 64918 64919 64920 64921 64922 64923 64924 64925 64926 64927 | ** ** This function is called when a free-list leaf page is removed from the ** free-list for reuse. It returns false if it is safe to retrieve the ** page from the pager layer with the 'no-content' flag set. True otherwise. */ static int btreeGetHasContent(BtShared *pBt, Pgno pgno){ Bitvec *p = pBt->pHasContent; return p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTestNotNull(p, pgno)); } /* ** Clear (destroy) the BtShared.pHasContent bitvec. This should be ** invoked at the conclusion of each write-transaction. */ static void btreeClearHasContent(BtShared *pBt){ |
65550 65551 65552 65553 65554 65555 65556 | if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; int sz2 = 0; int sz = get2byte(&data[iFree+2]); int top = get2byte(&data[hdr+5]); | | | 65751 65752 65753 65754 65755 65756 65757 65758 65759 65760 65761 65762 65763 65764 65765 | if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; int sz2 = 0; int sz = get2byte(&data[iFree+2]); int top = get2byte(&data[hdr+5]); if( top>=iFree ){ return SQLITE_CORRUPT_PAGE(pPage); } if( iFree2 ){ if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); sz2 = get2byte(&data[iFree2+2]); if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); |
65881 65882 65883 65884 65885 65886 65887 | } x = get2byte(&data[hdr+5]); if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another ** freelist entry */ if( iStart<x ) return SQLITE_CORRUPT_PAGE(pPage); | | | 66082 66083 66084 66085 66086 66087 66088 66089 66090 66091 66092 66093 66094 66095 66096 | } x = get2byte(&data[hdr+5]); if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another ** freelist entry */ if( iStart<x ) return SQLITE_CORRUPT_PAGE(pPage); if( iPtr!=hdr+1 ) return SQLITE_CORRUPT_PAGE(pPage); put2byte(&data[hdr+1], iFreeBlk); put2byte(&data[hdr+5], iEnd); }else{ /* Insert the new freeblock into the freelist */ put2byte(&data[iPtr], iStart); } if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){ |
66405 66406 66407 66408 66409 66410 66411 | /* ** Invoke the busy handler for a btree. */ static int btreeInvokeBusyHandler(void *pArg){ BtShared *pBt = (BtShared*)pArg; assert( pBt->db ); assert( sqlite3_mutex_held(pBt->db->mutex) ); | | < | 66606 66607 66608 66609 66610 66611 66612 66613 66614 66615 66616 66617 66618 66619 66620 | /* ** Invoke the busy handler for a btree. */ static int btreeInvokeBusyHandler(void *pArg){ BtShared *pBt = (BtShared*)pArg; assert( pBt->db ); assert( sqlite3_mutex_held(pBt->db->mutex) ); return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); } /* ** Open a database file. ** ** zFilename is the name of the database file. If zFilename is NULL ** then an ephemeral database is created. The ephemeral database might |
66957 66958 66959 66960 66961 66962 66963 66964 | ** bytes per page is left unchanged. ** ** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size ** and autovacuum mode can no longer be changed. */ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; BtShared *pBt = p->pBt; | > | < | > | < < < | 67157 67158 67159 67160 67161 67162 67163 67164 67165 67166 67167 67168 67169 67170 67171 67172 67173 67174 67175 67176 67177 67178 67179 67180 67181 | ** bytes per page is left unchanged. ** ** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size ** and autovacuum mode can no longer be changed. */ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; int x; BtShared *pBt = p->pBt; assert( nReserve>=0 && nReserve<=255 ); sqlite3BtreeEnter(p); pBt->nReserveWanted = nReserve; x = pBt->pageSize - pBt->usableSize; if( nReserve<x ) nReserve = x; if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); return SQLITE_READONLY; } assert( nReserve>=0 && nReserve<=255 ); if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && ((pageSize-1)&pageSize)==0 ){ assert( (pageSize & 7)==0 ); assert( !pBt->pCursor ); pBt->pageSize = (u32)pageSize; freeTempSpace(pBt); |
67015 67016 67017 67018 67019 67020 67021 | } /* ** Return the number of bytes of space at the end of every page that ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. ** | < | > | | | > | < < < | | 67213 67214 67215 67216 67217 67218 67219 67220 67221 67222 67223 67224 67225 67226 67227 67228 67229 67230 67231 67232 67233 67234 67235 67236 67237 | } /* ** Return the number of bytes of space at the end of every page that ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. ** ** The value returned is the larger of the current reserve size and ** the latest reserve size requested by SQLITE_FILECTRL_RESERVE_BYTES. ** The amount of reserve can only grow - never shrink. */ SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree *p){ int n1, n2; sqlite3BtreeEnter(p); n1 = (int)p->pBt->nReserveWanted; n2 = sqlite3BtreeGetReserveNoMutex(p); sqlite3BtreeLeave(p); return n1>n2 ? n1 : n2; } /* ** Set the maximum page count for a database if mxPage is positive. ** No changes are made if mxPage is 0 or negative. ** Regardless of the value of mxPage, return the maximum page count. |
67477 67478 67479 67480 67481 67482 67483 67484 67485 67486 67487 67488 67489 67490 67491 67492 67493 67494 67495 67496 67497 67498 | ** One or the other of the two processes must give way or there can be ** no progress. By returning SQLITE_BUSY and not invoking the busy callback ** when A already has a read lock, we encourage A to give up and let B ** proceed. */ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ BtShared *pBt = p->pBt; int rc = SQLITE_OK; sqlite3BtreeEnter(p); btreeIntegrity(p); /* If the btree is already in a write-transaction, or it ** is already in a read-transaction and a read-transaction ** is requested, this is a no-op. */ if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ goto trans_begun; } assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); if( (p->db->flags & SQLITE_ResetDatabase) | > | | 67673 67674 67675 67676 67677 67678 67679 67680 67681 67682 67683 67684 67685 67686 67687 67688 67689 67690 67691 67692 67693 67694 67695 67696 67697 67698 67699 67700 67701 67702 67703 | ** One or the other of the two processes must give way or there can be ** no progress. By returning SQLITE_BUSY and not invoking the busy callback ** when A already has a read lock, we encourage A to give up and let B ** proceed. */ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ BtShared *pBt = p->pBt; Pager *pPager = pBt->pPager; int rc = SQLITE_OK; sqlite3BtreeEnter(p); btreeIntegrity(p); /* If the btree is already in a write-transaction, or it ** is already in a read-transaction and a read-transaction ** is requested, this is a no-op. */ if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ goto trans_begun; } assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); if( (p->db->flags & SQLITE_ResetDatabase) && sqlite3PagerIsreadonly(pPager)==0 ){ pBt->btsFlags &= ~BTS_READ_ONLY; } /* Write transactions are not possible on a read-only database */ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ rc = SQLITE_READONLY; |
67540 67541 67542 67543 67544 67545 67546 67547 67548 67549 67550 67551 67552 67553 67554 67555 67556 67557 67558 67559 | ** on page 1, the transaction cannot be opened. */ rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); if( SQLITE_OK!=rc ) goto trans_begun; pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; do { /* Call lockBtree() until either pBt->pPage1 is populated or ** lockBtree() returns something other than SQLITE_OK. lockBtree() ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after ** reading page 1 it discovers that the page-size of the database ** file is not pBt->pageSize. In this case lockBtree() will update ** pBt->pageSize to the page-size of the file on disk. */ while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); if( rc==SQLITE_OK && wrflag ){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ | > > > > > > > > > > > > | > | > > > | 67737 67738 67739 67740 67741 67742 67743 67744 67745 67746 67747 67748 67749 67750 67751 67752 67753 67754 67755 67756 67757 67758 67759 67760 67761 67762 67763 67764 67765 67766 67767 67768 67769 67770 67771 67772 67773 67774 67775 67776 67777 67778 67779 67780 67781 67782 67783 67784 67785 67786 67787 67788 67789 67790 67791 67792 67793 67794 67795 67796 67797 | ** on page 1, the transaction cannot be opened. */ rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); if( SQLITE_OK!=rc ) goto trans_begun; pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; do { sqlite3PagerWalDb(pPager, p->db); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* If transitioning from no transaction directly to a write transaction, ** block for the WRITER lock first if possible. */ if( pBt->pPage1==0 && wrflag ){ assert( pBt->inTransaction==TRANS_NONE ); rc = sqlite3PagerWalWriteLock(pPager, 1); if( rc!=SQLITE_BUSY && rc!=SQLITE_OK ) break; } #endif /* Call lockBtree() until either pBt->pPage1 is populated or ** lockBtree() returns something other than SQLITE_OK. lockBtree() ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after ** reading page 1 it discovers that the page-size of the database ** file is not pBt->pageSize. In this case lockBtree() will update ** pBt->pageSize to the page-size of the file on disk. */ while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); if( rc==SQLITE_OK && wrflag ){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ rc = sqlite3PagerBegin(pPager, wrflag>1, sqlite3TempInMemory(p->db)); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); }else if( rc==SQLITE_BUSY_SNAPSHOT && pBt->inTransaction==TRANS_NONE ){ /* if there was no transaction opened when this function was ** called and SQLITE_BUSY_SNAPSHOT is returned, change the error ** code to SQLITE_BUSY. */ rc = SQLITE_BUSY; } } } if( rc!=SQLITE_OK ){ (void)sqlite3PagerWalWriteLock(pPager, 0); unlockBtreeIfUnused(pBt); } }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); sqlite3PagerWalDb(pPager, 0); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; #endif if( rc==SQLITE_OK ){ if( p->inTrans==TRANS_NONE ){ pBt->nTransaction++; #ifndef SQLITE_OMIT_SHARED_CACHE if( p->sharable ){ assert( p->lock.pBtree==p && p->lock.iTable==1 ); |
67622 67623 67624 67625 67626 67627 67628 | *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); } if( wrflag ){ /* This call makes sure that the pager has the correct number of ** open savepoints. If the second parameter is greater than 0 and ** the sub-journal is not already open, then it will be opened here. */ | | | 67835 67836 67837 67838 67839 67840 67841 67842 67843 67844 67845 67846 67847 67848 67849 | *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); } if( wrflag ){ /* This call makes sure that the pager has the correct number of ** open savepoints. If the second parameter is greater than 0 and ** the sub-journal is not already open, then it will be opened here. */ rc = sqlite3PagerOpenSavepoint(pPager, p->db->nSavepoint); } } btreeIntegrity(p); sqlite3BtreeLeave(p); return rc; } |
71258 71259 71260 71261 71262 71263 71264 | memcpy(pTmp, aData, pPg->pBt->usableSize); #endif /* Remove cells from the start and end of the page */ assert( nCell>=0 ); if( iOld<iNew ){ int nShift = pageFreeArray(pPg, iOld, iNew-iOld, pCArray); | | | 71471 71472 71473 71474 71475 71476 71477 71478 71479 71480 71481 71482 71483 71484 71485 | memcpy(pTmp, aData, pPg->pBt->usableSize); #endif /* Remove cells from the start and end of the page */ assert( nCell>=0 ); if( iOld<iNew ){ int nShift = pageFreeArray(pPg, iOld, iNew-iOld, pCArray); if( NEVER(nShift>nCell) ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); assert( nCell>=nTail ); nCell -= nTail; |
73615 73616 73617 73618 73619 73620 73621 | } #endif } sqlite3BtreeLeave(p); return rc; } | < | 73828 73829 73830 73831 73832 73833 73834 73835 73836 73837 73838 73839 73840 73841 | } #endif } sqlite3BtreeLeave(p); return rc; } /* ** The first argument, pCur, is a cursor opened on some b-tree. Count the ** number of entries in the b-tree and write the result to *pnEntry. ** ** SQLITE_OK is returned if the operation is successfully executed. ** Otherwise, if an error is encountered (i.e. an IO error or database ** corruption) an SQLite error code is returned. |
73637 73638 73639 73640 73641 73642 73643 | *pnEntry = 0; return SQLITE_OK; } /* Unless an error occurs, the following loop runs one iteration for each ** page in the B-Tree structure (not including overflow pages). */ | | | 73849 73850 73851 73852 73853 73854 73855 73856 73857 73858 73859 73860 73861 73862 73863 | *pnEntry = 0; return SQLITE_OK; } /* Unless an error occurs, the following loop runs one iteration for each ** page in the B-Tree structure (not including overflow pages). */ while( rc==SQLITE_OK && !AtomicLoad(&db->u1.isInterrupted) ){ int iIdx; /* Index of child node in parent */ MemPage *pPage; /* Current page of the b-tree */ /* If this is a leaf page or the tree is not an int-key tree, then ** this page contains countable entries. Increment the entry counter ** accordingly. */ |
73688 73689 73690 73691 73692 73693 73694 | rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); } } /* An error has occurred. Return an error code. */ return rc; } | < | 73900 73901 73902 73903 73904 73905 73906 73907 73908 73909 73910 73911 73912 73913 | rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); } } /* An error has occurred. Return an error code. */ return rc; } /* ** Return the pager associated with a BTree. This routine is used for ** testing and debugging only. */ SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ return p->pBt->pPager; |
73763 73764 73765 73766 73767 73768 73769 | checkAppendMsg(pCheck, "invalid page number %d", iPage); return 1; } if( getPageReferenced(pCheck, iPage) ){ checkAppendMsg(pCheck, "2nd reference to page %d", iPage); return 1; } | | | 73974 73975 73976 73977 73978 73979 73980 73981 73982 73983 73984 73985 73986 73987 73988 | checkAppendMsg(pCheck, "invalid page number %d", iPage); return 1; } if( getPageReferenced(pCheck, iPage) ){ checkAppendMsg(pCheck, "2nd reference to page %d", iPage); return 1; } if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1; setPageReferenced(pCheck, iPage); return 0; } #ifndef SQLITE_OMIT_AUTOVACUUM /* ** Check that the entry in the pointer-map for page iChild maps to |
74739 74740 74741 74742 74743 74744 74745 | /* ** Attempt to set the page size of the destination to match the page size ** of the source. */ static int setDestPgsz(sqlite3_backup *p){ int rc; | | | 74950 74951 74952 74953 74954 74955 74956 74957 74958 74959 74960 74961 74962 74963 74964 | /* ** Attempt to set the page size of the destination to match the page size ** of the source. */ static int setDestPgsz(sqlite3_backup *p){ int rc; rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),0,0); return rc; } /* ** Check that there is no open read-transaction on the b-tree passed as the ** second argument. If there is not, return SQLITE_OK. Otherwise, if there ** is an open read-transaction, return SQLITE_ERROR and leave an error |
74862 74863 74864 74865 74866 74867 74868 | int bUpdate /* True for an update, false otherwise */ ){ Pager * const pDestPager = sqlite3BtreePager(p->pDest); const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); const int nCopy = MIN(nSrcPgsz, nDestPgsz); const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; | < < < < < < < < < < < < < < < < < < < < < < < < < < < | 75073 75074 75075 75076 75077 75078 75079 75080 75081 75082 75083 75084 75085 75086 75087 75088 75089 75090 75091 75092 75093 75094 75095 75096 75097 75098 75099 75100 75101 75102 | int bUpdate /* True for an update, false otherwise */ ){ Pager * const pDestPager = sqlite3BtreePager(p->pDest); const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); const int nCopy = MIN(nSrcPgsz, nDestPgsz); const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; int rc = SQLITE_OK; i64 iOff; assert( sqlite3BtreeGetReserveNoMutex(p->pSrc)>=0 ); assert( p->bDestLocked ); assert( !isFatalError(p->rc) ); assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); assert( zSrcData ); /* Catch the case where the destination is an in-memory database and the ** page sizes of the source and destination differ. */ if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ rc = SQLITE_READONLY; } /* This loop runs once for each destination page spanned by the source ** page. For each iteration, variable iOff is set to the byte offset ** of the destination page. */ for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOff<iEnd; iOff+=nDestPgsz){ DbPage *pDestPg = 0; Pgno iDest = (Pgno)(iOff/nDestPgsz)+1; |
75400 75401 75402 75403 75404 75405 75406 | */ memset(&b, 0, sizeof(b)); b.pSrcDb = pFrom->db; b.pSrc = pFrom; b.pDest = pTo; b.iNext = 1; | < < < < | 75584 75585 75586 75587 75588 75589 75590 75591 75592 75593 75594 75595 75596 75597 | */ memset(&b, 0, sizeof(b)); b.pSrcDb = pFrom->db; b.pSrc = pFrom; b.pDest = pTo; b.iNext = 1; /* 0x7FFFFFFF is the hard limit for the number of pages in a database ** file. By passing this as the number of pages to copy to ** sqlite3_backup_step(), we can guarantee that the copy finishes ** within a single call (unless an error occurs). The assert() statement ** checks this assumption - (p->rc) should be set to either SQLITE_DONE ** or an error code. */ sqlite3_backup_step(&b, 0x7FFFFFFF); |
76393 76394 76395 76396 76397 76398 76399 | for(i=1, pX=pVdbe->aMem+1; i<pVdbe->nMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ u16 mFlags; if( pVdbe->db->flags & SQLITE_VdbeTrace ){ sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); } | | < < < < < | 76573 76574 76575 76576 76577 76578 76579 76580 76581 76582 76583 76584 76585 76586 76587 76588 76589 76590 76591 76592 76593 76594 | for(i=1, pX=pVdbe->aMem+1; i<pVdbe->nMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ u16 mFlags; if( pVdbe->db->flags & SQLITE_VdbeTrace ){ sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); } /* If pX is marked as a shallow copy of pMem, then try to verify that ** no significant changes have been made to pX since the OP_SCopy. ** A significant change would indicated a missed call to this ** function for pX. Minor changes, such as adding or removing a ** dual type, are allowed, as long as the underlying value is the ** same. */ mFlags = pMem->flags & pX->flags & pX->mScopyFlags; assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); /* pMem is the register that is changing. But also mark pX as ** undefined so that we can quickly detect the shallow-copy error */ pX->flags = MEM_Undefined; pX->pScopyFrom = 0; } } |
76601 76602 76603 76604 76605 76606 76607 | ** pMem->zMalloc space will be allocated if necessary. The calling routine ** is responsible for making sure that the pMem object is eventually ** destroyed. ** ** If this routine fails for any reason (malloc returns NULL or unable ** to read from the disk) then the pMem is left in an inconsistent state. */ | | | 76776 76777 76778 76779 76780 76781 76782 76783 76784 76785 76786 76787 76788 76789 76790 | ** pMem->zMalloc space will be allocated if necessary. The calling routine ** is responsible for making sure that the pMem object is eventually ** destroyed. ** ** If this routine fails for any reason (malloc returns NULL or unable ** to read from the disk) then the pMem is left in an inconsistent state. */ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 offset, /* Offset from the start of data to return bytes from. */ u32 amt, /* Number of bytes to return. */ Mem *pMem /* OUT: Return data in this Mem structure. */ ){ int rc; pMem->flags = MEM_Null; |
76624 76625 76626 76627 76628 76629 76630 | pMem->n = (int)amt; }else{ sqlite3VdbeMemRelease(pMem); } } return rc; } | | < < | | | < | | 76799 76800 76801 76802 76803 76804 76805 76806 76807 76808 76809 76810 76811 76812 76813 76814 76815 76816 76817 76818 76819 76820 76821 76822 76823 76824 76825 76826 76827 76828 76829 76830 76831 76832 76833 76834 | pMem->n = (int)amt; }else{ sqlite3VdbeMemRelease(pMem); } } return rc; } SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 amt, /* Number of bytes to return. */ Mem *pMem /* OUT: Return data in this Mem structure. */ ){ u32 available = 0; /* Number of bytes available on the local btree page */ int rc = SQLITE_OK; /* Return code */ assert( sqlite3BtreeCursorIsValid(pCur) ); assert( !VdbeMemDynamic(pMem) ); /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() ** that both the BtShared and database handle mutexes are held. */ assert( !sqlite3VdbeMemIsRowSet(pMem) ); pMem->z = (char *)sqlite3BtreePayloadFetch(pCur, &available); assert( pMem->z!=0 ); if( amt<=available ){ pMem->flags = MEM_Blob|MEM_Ephem; pMem->n = (int)amt; }else{ rc = sqlite3VdbeMemFromBtree(pCur, 0, amt, pMem); } return rc; } /* ** The pVal argument is known to be a value other than NULL. |
77763 77764 77765 77766 77767 77768 77769 | SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ (void)z1; (void)z2; } #endif /* | | | 77935 77936 77937 77938 77939 77940 77941 77942 77943 77944 77945 77946 77947 77948 77949 | SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ (void)z1; (void)z2; } #endif /* ** Add a new OP_Explain opcode. ** ** If the bPush flag is true, then make this opcode the parent for ** subsequent Explains until sqlite3VdbeExplainPop() is called. */ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ #ifndef SQLITE_DEBUG /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. |
78404 78405 78406 78407 78408 78409 78410 78411 78412 78413 78414 78415 78416 78417 | ** Change the P2 operand of instruction addr so that it points to ** the address of the next instruction to be coded. */ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ sqlite3VdbeChangeP2(p, addr, p->nOp); } /* ** If the input FuncDef structure is ephemeral, then free it. If ** the FuncDef is not ephermal, then do nothing. */ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 78576 78577 78578 78579 78580 78581 78582 78583 78584 78585 78586 78587 78588 78589 78590 78591 78592 78593 78594 78595 78596 78597 78598 78599 78600 78601 78602 78603 78604 78605 78606 78607 78608 78609 78610 78611 78612 78613 78614 78615 78616 78617 | ** Change the P2 operand of instruction addr so that it points to ** the address of the next instruction to be coded. */ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ sqlite3VdbeChangeP2(p, addr, p->nOp); } /* ** Change the P2 operand of the jump instruction at addr so that ** the jump lands on the next opcode. Or if the jump instruction was ** the previous opcode (and is thus a no-op) then simply back up ** the next instruction counter by one slot so that the jump is ** overwritten by the next inserted opcode. ** ** This routine is an optimization of sqlite3VdbeJumpHere() that ** strives to omit useless byte-code like this: ** ** 7 Once 0 8 0 ** 8 ... */ SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){ if( addr==p->nOp-1 ){ assert( p->aOp[addr].opcode==OP_Once || p->aOp[addr].opcode==OP_If || p->aOp[addr].opcode==OP_FkIfZero ); assert( p->aOp[addr].p4type==0 ); #ifdef SQLITE_VDBE_COVERAGE sqlite3VdbeGetOp(p,-1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ #endif p->nOp--; }else{ sqlite3VdbeChangeP2(p, addr, p->nOp); } } /* ** If the input FuncDef structure is ephemeral, then free it. If ** the FuncDef is not ephermal, then do nothing. */ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ |
78775 78776 78777 78778 78779 78780 78781 | ** Some translation occurs: ** ** "PX" -> "r[X]" ** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 ** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 ** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x */ | | > | < < | > > > | | | < < | | > > > > > > > > > > > > > > > > | | | | < > < > | | < < | > > | < < < | | | 78975 78976 78977 78978 78979 78980 78981 78982 78983 78984 78985 78986 78987 78988 78989 78990 78991 78992 78993 78994 78995 78996 78997 78998 78999 79000 79001 79002 79003 79004 79005 79006 79007 79008 79009 79010 79011 79012 79013 79014 79015 79016 79017 79018 79019 79020 79021 79022 79023 79024 79025 79026 79027 79028 79029 79030 79031 79032 79033 79034 79035 79036 79037 79038 79039 79040 79041 79042 79043 79044 79045 79046 79047 79048 79049 79050 79051 79052 79053 79054 79055 79056 79057 79058 79059 79060 79061 79062 79063 79064 79065 79066 79067 79068 79069 79070 79071 79072 79073 | ** Some translation occurs: ** ** "PX" -> "r[X]" ** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 ** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 ** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x */ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( sqlite3 *db, /* Optional - Oom error reporting only */ const Op *pOp, /* The opcode to be commented */ const char *zP4 /* Previously obtained value for P4 */ ){ const char *zOpName; const char *zSynopsis; int nOpName; int ii; char zAlt[50]; StrAccum x; sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); zOpName = sqlite3OpcodeName(pOp->opcode); nOpName = sqlite3Strlen30(zOpName); if( zOpName[nOpName+1] ){ int seenCom = 0; char c; zSynopsis = zOpName += nOpName + 1; if( strncmp(zSynopsis,"IF ",3)==0 ){ if( pOp->p5 & SQLITE_STOREP2 ){ sqlite3_snprintf(sizeof(zAlt), zAlt, "r[P2] = (%s)", zSynopsis+3); }else{ sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); } zSynopsis = zAlt; } for(ii=0; (c = zSynopsis[ii])!=0; ii++){ if( c=='P' ){ c = zSynopsis[++ii]; if( c=='4' ){ sqlite3_str_appendall(&x, zP4); }else if( c=='X' ){ sqlite3_str_appendall(&x, pOp->zComment); seenCom = 1; }else{ int v1 = translateP(c, pOp); int v2; if( strncmp(zSynopsis+ii+1, "@P", 2)==0 ){ ii += 3; v2 = translateP(zSynopsis[ii], pOp); if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ ii += 2; v2++; } if( v2<2 ){ sqlite3_str_appendf(&x, "%d", v1); }else{ sqlite3_str_appendf(&x, "%d..%d", v1, v1+v2-1); } }else if( strncmp(zSynopsis+ii+1, "@NP", 3)==0 ){ sqlite3_context *pCtx = pOp->p4.pCtx; if( pOp->p4type!=P4_FUNCCTX || pCtx->argc==1 ){ sqlite3_str_appendf(&x, "%d", v1); }else if( pCtx->argc>1 ){ sqlite3_str_appendf(&x, "%d..%d", v1, v1+pCtx->argc-1); }else{ assert( x.nChar>2 ); x.nChar -= 2; ii++; } ii += 3; }else{ sqlite3_str_appendf(&x, "%d", v1); if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ ii += 4; } } } }else{ sqlite3_str_appendchar(&x, 1, c); } } if( !seenCom && pOp->zComment ){ sqlite3_str_appendf(&x, "; %s", pOp->zComment); } }else if( pOp->zComment ){ sqlite3_str_appendall(&x, pOp->zComment); } if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ sqlite3OomFault(db); } return sqlite3StrAccumFinish(&x); } #endif /* SQLITE_ENABLE_EXPLAIN_COMMENTS */ #if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) /* ** Translate the P4.pExpr value for an OP_CursorHint opcode into text ** that can be displayed in the P4 column of EXPLAIN output. */ static void displayP4Expr(StrAccum *p, Expr *pExpr){ |
78927 78928 78929 78930 78931 78932 78933 | #if VDBE_DISPLAY_P4 /* ** Compute a string that describes the P4 parameter for an opcode. ** Use zTemp for any required temporary buffer space. */ | | | | | | 79140 79141 79142 79143 79144 79145 79146 79147 79148 79149 79150 79151 79152 79153 79154 79155 79156 79157 79158 | #if VDBE_DISPLAY_P4 /* ** Compute a string that describes the P4 parameter for an opcode. ** Use zTemp for any required temporary buffer space. */ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ char *zP4 = 0; StrAccum x; sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); switch( pOp->p4type ){ case P4_KEYINFO: { int j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; assert( pKeyInfo->aSortFlags!=0 ); sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); for(j=0; j<pKeyInfo->nKeyField; j++){ |
78957 78958 78959 78960 78961 78962 78963 78964 | #ifdef SQLITE_ENABLE_CURSOR_HINTS case P4_EXPR: { displayP4Expr(&x, pOp->p4.pExpr); break; } #endif case P4_COLLSEQ: { CollSeq *pColl = pOp->p4.pColl; | > > | > | 79170 79171 79172 79173 79174 79175 79176 79177 79178 79179 79180 79181 79182 79183 79184 79185 79186 79187 79188 | #ifdef SQLITE_ENABLE_CURSOR_HINTS case P4_EXPR: { displayP4Expr(&x, pOp->p4.pExpr); break; } #endif case P4_COLLSEQ: { static const char *const encnames[] = {"?", "8", "16LE", "16BE"}; CollSeq *pColl = pOp->p4.pColl; assert( pColl->enc>=0 && pColl->enc<4 ); sqlite3_str_appendf(&x, "%.18s-%s", pColl->zName, encnames[pColl->enc]); break; } case P4_FUNCDEF: { FuncDef *pDef = pOp->p4.pFunc; sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } |
79012 79013 79014 79015 79016 79017 79018 | #endif case P4_INTARRAY: { int i; int *ai = pOp->p4.ai; int n = ai[0]; /* The first element of an INTARRAY is always the ** count of the number of elements to follow */ for(i=1; i<=n; i++){ | | < | < | < < < | | > > > | < < | 79228 79229 79230 79231 79232 79233 79234 79235 79236 79237 79238 79239 79240 79241 79242 79243 79244 79245 79246 79247 79248 79249 79250 79251 79252 79253 79254 79255 79256 79257 79258 79259 79260 79261 79262 79263 79264 79265 79266 79267 | #endif case P4_INTARRAY: { int i; int *ai = pOp->p4.ai; int n = ai[0]; /* The first element of an INTARRAY is always the ** count of the number of elements to follow */ for(i=1; i<=n; i++){ sqlite3_str_appendf(&x, "%c%d", (i==1 ? '[' : ','), ai[i]); } sqlite3_str_append(&x, "]", 1); break; } case P4_SUBPROGRAM: { zP4 = "program"; break; } case P4_DYNBLOB: case P4_ADVANCE: { break; } case P4_TABLE: { zP4 = pOp->p4.pTab->zName; break; } default: { zP4 = pOp->p4.z; } } if( zP4 ) sqlite3_str_appendall(&x, zP4); if( (x.accError & SQLITE_NOMEM)!=0 ){ sqlite3OomFault(db); } return sqlite3StrAccumFinish(&x); } #endif /* VDBE_DISPLAY_P4 */ /* ** Declare to the Vdbe that the BTree object at db->aDb[i] is used. ** ** The prepared statements need to know in advance the complete set of |
79131 79132 79133 79134 79135 79136 79137 | #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) /* ** Print a single opcode. This routine is used for debugging only. */ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ char *zP4; | | | > > | | | | > | > > > | 79343 79344 79345 79346 79347 79348 79349 79350 79351 79352 79353 79354 79355 79356 79357 79358 79359 79360 79361 79362 79363 79364 79365 79366 79367 79368 79369 79370 79371 79372 79373 79374 79375 79376 79377 79378 79379 79380 | #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) /* ** Print a single opcode. This routine is used for debugging only. */ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ char *zP4; char *zCom; sqlite3 dummyDb; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; if( pOut==0 ) pOut = stdout; sqlite3BeginBenignMalloc(); dummyDb.mallocFailed = 1; zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS zCom = sqlite3VdbeDisplayComment(0, pOp, zP4); #else zCom = 0; #endif /* NB: The sqlite3OpcodeName() function is implemented by code created ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the ** information from the vdbe.c source text */ fprintf(pOut, zFormat1, pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4 ? zP4 : "", pOp->p5, zCom ? zCom : "" ); fflush(pOut); sqlite3_free(zP4); sqlite3_free(zCom); sqlite3EndBenignMalloc(); } #endif /* ** Initialize an array of N Mem element. */ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ |
79239 79240 79241 79242 79243 79244 79245 79246 79247 79248 79249 79250 79251 79252 | SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){ VdbeFrame *pFrame = (VdbeFrame*)pArg; assert( sqlite3VdbeFrameIsValid(pFrame) ); pFrame->pParent = pFrame->v->pDelFrame; pFrame->v->pDelFrame = pFrame; } /* ** Delete a VdbeFrame object and its contents. VdbeFrame objects are ** allocated by the OP_Program opcode in sqlite3VdbeExec(). */ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ int i; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 79457 79458 79459 79460 79461 79462 79463 79464 79465 79466 79467 79468 79469 79470 79471 79472 79473 79474 79475 79476 79477 79478 79479 79480 79481 79482 79483 79484 79485 79486 79487 79488 79489 79490 79491 79492 79493 79494 79495 79496 79497 79498 79499 79500 79501 79502 79503 79504 79505 79506 79507 79508 79509 79510 79511 79512 79513 79514 79515 79516 79517 79518 79519 79520 79521 79522 79523 79524 79525 79526 79527 79528 79529 79530 79531 79532 79533 79534 79535 79536 79537 79538 79539 79540 79541 79542 79543 79544 79545 79546 79547 79548 79549 79550 79551 79552 79553 79554 79555 79556 79557 79558 79559 79560 79561 79562 79563 79564 79565 79566 79567 79568 79569 79570 79571 79572 79573 79574 79575 79576 79577 79578 79579 79580 79581 79582 79583 79584 79585 | SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){ VdbeFrame *pFrame = (VdbeFrame*)pArg; assert( sqlite3VdbeFrameIsValid(pFrame) ); pFrame->pParent = pFrame->v->pDelFrame; pFrame->v->pDelFrame = pFrame; } #if defined(SQLITE_ENABLE_BYTECODE_VTAB) || !defined(SQLITE_OMIT_EXPLAIN) /* ** Locate the next opcode to be displayed in EXPLAIN or EXPLAIN ** QUERY PLAN output. ** ** Return SQLITE_ROW on success. Return SQLITE_DONE if there are no ** more opcodes to be displayed. */ SQLITE_PRIVATE int sqlite3VdbeNextOpcode( Vdbe *p, /* The statement being explained */ Mem *pSub, /* Storage for keeping track of subprogram nesting */ int eMode, /* 0: normal. 1: EQP. 2: TablesUsed */ int *piPc, /* IN/OUT: Current rowid. Overwritten with next rowid */ int *piAddr, /* OUT: Write index into (*paOp)[] here */ Op **paOp /* OUT: Write the opcode array here */ ){ int nRow; /* Stop when row count reaches this */ int nSub = 0; /* Number of sub-vdbes seen so far */ SubProgram **apSub = 0; /* Array of sub-vdbes */ int i; /* Next instruction address */ int rc = SQLITE_OK; /* Result code */ Op *aOp = 0; /* Opcode array */ int iPc; /* Rowid. Copy of value in *piPc */ /* When the number of output rows reaches nRow, that means the ** listing has finished and sqlite3_step() should return SQLITE_DONE. ** nRow is the sum of the number of rows in the main program, plus ** the sum of the number of rows in all trigger subprograms encountered ** so far. The nRow value will increase as new trigger subprograms are ** encountered, but p->pc will eventually catch up to nRow. */ nRow = p->nOp; if( pSub!=0 ){ if( pSub->flags&MEM_Blob ){ /* pSub is initiallly NULL. It is initialized to a BLOB by ** the P4_SUBPROGRAM processing logic below */ nSub = pSub->n/sizeof(Vdbe*); apSub = (SubProgram **)pSub->z; } for(i=0; i<nSub; i++){ nRow += apSub[i]->nOp; } } iPc = *piPc; while(1){ /* Loop exits via break */ i = iPc++; if( i>=nRow ){ p->rc = SQLITE_OK; rc = SQLITE_DONE; break; } if( i<p->nOp ){ /* The rowid is small enough that we are still in the ** main program. */ aOp = p->aOp; }else{ /* We are currently listing subprograms. Figure out which one and ** pick up the appropriate opcode. */ int j; i -= p->nOp; assert( apSub!=0 ); assert( nSub>0 ); for(j=0; i>=apSub[j]->nOp; j++){ i -= apSub[j]->nOp; assert( i<apSub[j]->nOp || j+1<nSub ); } aOp = apSub[j]->aOp; } /* When an OP_Program opcode is encounter (the only opcode that has ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms ** kept in p->aMem[9].z to hold the new program - assuming this subprogram ** has not already been seen. */ if( pSub!=0 && aOp[i].p4type==P4_SUBPROGRAM ){ int nByte = (nSub+1)*sizeof(SubProgram*); int j; for(j=0; j<nSub; j++){ if( apSub[j]==aOp[i].p4.pProgram ) break; } if( j==nSub ){ p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); if( p->rc!=SQLITE_OK ){ rc = SQLITE_ERROR; break; } apSub = (SubProgram **)pSub->z; apSub[nSub++] = aOp[i].p4.pProgram; MemSetTypeFlag(pSub, MEM_Blob); pSub->n = nSub*sizeof(SubProgram*); nRow += aOp[i].p4.pProgram->nOp; } } if( eMode==0 ) break; #ifdef SQLITE_ENABLE_BYTECODE_VTAB if( eMode==2 ){ Op *pOp = aOp + i; if( pOp->opcode==OP_OpenRead ) break; if( pOp->opcode==OP_OpenWrite && (pOp->p5 & OPFLAG_P2ISREG)==0 ) break; if( pOp->opcode==OP_ReopenIdx ) break; }else #endif { assert( eMode==1 ); if( aOp[i].opcode==OP_Explain ) break; if( aOp[i].opcode==OP_Init && iPc>1 ) break; } } *piPc = iPc; *piAddr = i; *paOp = aOp; return rc; } #endif /* SQLITE_ENABLE_BYTECODE_VTAB || !SQLITE_OMIT_EXPLAIN */ /* ** Delete a VdbeFrame object and its contents. VdbeFrame objects are ** allocated by the OP_Program opcode in sqlite3VdbeExec(). */ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ int i; |
79279 79280 79281 79282 79283 79284 79285 | ** ** When p->explain==1, first the main program is listed, then each of ** the trigger subprograms are listed one by one. */ SQLITE_PRIVATE int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ | < < < > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < | < < < < | < | | < < < < < < < < < < < < | < < < | < < < < < < < < < < < < > | | | < < < | < < < < < < < | < < < | < < < | < < < | < < < < < < < < < | | | < | | < | < < < < < < < | | > | < | < < < < > < | | > | > > > > | | > | 79612 79613 79614 79615 79616 79617 79618 79619 79620 79621 79622 79623 79624 79625 79626 79627 79628 79629 79630 79631 79632 79633 79634 79635 79636 79637 79638 79639 79640 79641 79642 79643 79644 79645 79646 79647 79648 79649 79650 79651 79652 79653 79654 79655 79656 79657 79658 79659 79660 79661 79662 79663 79664 79665 79666 79667 79668 79669 79670 79671 79672 79673 79674 79675 79676 79677 79678 79679 79680 79681 79682 79683 79684 79685 79686 79687 79688 79689 79690 79691 79692 79693 79694 79695 79696 79697 79698 79699 79700 79701 79702 79703 79704 79705 79706 79707 79708 | ** ** When p->explain==1, first the main program is listed, then each of ** the trigger subprograms are listed one by one. */ SQLITE_PRIVATE int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ Mem *pSub = 0; /* Memory cell hold array of subprogs */ sqlite3 *db = p->db; /* The database connection */ int i; /* Loop counter */ int rc = SQLITE_OK; /* Return code */ Mem *pMem = &p->aMem[1]; /* First Mem of result set */ int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0); Op *aOp; /* Array of opcodes */ Op *pOp; /* Current opcode */ assert( p->explain ); assert( p->magic==VDBE_MAGIC_RUN ); assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); /* Even though this opcode does not use dynamic strings for ** the result, result columns may become dynamic if the user calls ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. */ releaseMemArray(pMem, 8); p->pResultSet = 0; if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ sqlite3OomFault(db); return SQLITE_ERROR; } if( bListSubprogs ){ /* The first 8 memory cells are used for the result set. So we will ** commandeer the 9th cell to use as storage for an array of pointers ** to trigger subprograms. The VDBE is guaranteed to have at least 9 ** cells. */ assert( p->nMem>9 ); pSub = &p->aMem[9]; }else{ pSub = 0; } /* Figure out which opcode is next to display */ rc = sqlite3VdbeNextOpcode(p, pSub, p->explain==2, &p->pc, &i, &aOp); if( rc==SQLITE_OK ){ pOp = aOp + i; if( AtomicLoad(&db->u1.isInterrupted) ){ p->rc = SQLITE_INTERRUPT; rc = SQLITE_ERROR; sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); }else{ char *zP4 = sqlite3VdbeDisplayP4(db, pOp); if( p->explain==2 ){ sqlite3VdbeMemSetInt64(pMem, pOp->p1); sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); sqlite3VdbeMemSetInt64(pMem+2, pOp->p3); sqlite3VdbeMemSetStr(pMem+3, zP4, -1, SQLITE_UTF8, sqlite3_free); p->nResColumn = 4; }else{ sqlite3VdbeMemSetInt64(pMem+0, i); sqlite3VdbeMemSetStr(pMem+1, (char*)sqlite3OpcodeName(pOp->opcode), -1, SQLITE_UTF8, SQLITE_STATIC); sqlite3VdbeMemSetInt64(pMem+2, pOp->p1); sqlite3VdbeMemSetInt64(pMem+3, pOp->p2); sqlite3VdbeMemSetInt64(pMem+4, pOp->p3); /* pMem+5 for p4 is done last */ sqlite3VdbeMemSetInt64(pMem+6, pOp->p5); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS { char *zCom = sqlite3VdbeDisplayComment(db, pOp, zP4); sqlite3VdbeMemSetStr(pMem+7, zCom, -1, SQLITE_UTF8, sqlite3_free); } #else sqlite3VdbeMemSetNull(pMem+7); #endif sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); p->nResColumn = 8; } p->pResultSet = pMem; if( db->mallocFailed ){ p->rc = SQLITE_NOMEM; rc = SQLITE_ERROR; }else{ p->rc = SQLITE_OK; rc = SQLITE_ROW; } } } return rc; } #endif /* SQLITE_OMIT_EXPLAIN */ #ifdef SQLITE_DEBUG |
79671 79672 79673 79674 79675 79676 79677 79678 79679 79680 79681 79682 79683 79684 | if( pParse->explain ){ static const char * const azColName[] = { "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", "id", "parent", "notused", "detail" }; int iFirst, mx, i; if( nMem<10 ) nMem = 10; if( pParse->explain==2 ){ sqlite3VdbeSetNumCols(p, 4); iFirst = 8; mx = 12; }else{ sqlite3VdbeSetNumCols(p, 8); iFirst = 0; | > | 79902 79903 79904 79905 79906 79907 79908 79909 79910 79911 79912 79913 79914 79915 79916 | if( pParse->explain ){ static const char * const azColName[] = { "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", "id", "parent", "notused", "detail" }; int iFirst, mx, i; if( nMem<10 ) nMem = 10; p->explain = pParse->explain; if( pParse->explain==2 ){ sqlite3VdbeSetNumCols(p, 4); iFirst = 8; mx = 12; }else{ sqlite3VdbeSetNumCols(p, 8); iFirst = 0; |
79721 79722 79723 79724 79725 79726 79727 | p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); #endif } } p->pVList = pParse->pVList; pParse->pVList = 0; | < | 79953 79954 79955 79956 79957 79958 79959 79960 79961 79962 79963 79964 79965 79966 | p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); #endif } } p->pVList = pParse->pVList; pParse->pVList = 0; if( db->mallocFailed ){ p->nVar = 0; p->nCursor = 0; p->nMem = 0; }else{ p->nCursor = nCursor; p->nVar = (ynVar)nVar; |
80033 80034 80035 80036 80037 80038 80039 | i64 offset = 0; int res; int retryCount = 0; int nMainFile; /* Select a master journal file name */ nMainFile = sqlite3Strlen30(zMainFile); | | > | 80264 80265 80266 80267 80268 80269 80270 80271 80272 80273 80274 80275 80276 80277 80278 80279 80280 | i64 offset = 0; int res; int retryCount = 0; int nMainFile; /* Select a master journal file name */ nMainFile = sqlite3Strlen30(zMainFile); zMaster = sqlite3MPrintf(db, "%.4c%s%.16c", 0,zMainFile,0); if( zMaster==0 ) return SQLITE_NOMEM_BKPT; zMaster += 4; do { u32 iRandom; if( retryCount ){ if( retryCount>100 ){ sqlite3_log(SQLITE_FULL, "MJ delete: %s", zMaster); sqlite3OsDelete(pVfs, zMaster, 0); break; |
80064 80065 80066 80067 80068 80069 80070 | /* Open the master journal. */ rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 ); } if( rc!=SQLITE_OK ){ | | | 80296 80297 80298 80299 80300 80301 80302 80303 80304 80305 80306 80307 80308 80309 80310 | /* Open the master journal. */ rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 ); } if( rc!=SQLITE_OK ){ sqlite3DbFree(db, zMaster-4); return rc; } /* Write the name of each database file in the transaction into the new ** master journal file. If an error occurs at this point close ** and delete the master journal file. All the individual journal files ** still have 'null' as the master journal pointer, so they will roll |
80087 80088 80089 80090 80091 80092 80093 | } assert( zFile[0]!=0 ); rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset); offset += sqlite3Strlen30(zFile)+1; if( rc!=SQLITE_OK ){ sqlite3OsCloseFree(pMaster); sqlite3OsDelete(pVfs, zMaster, 0); | | | | 80319 80320 80321 80322 80323 80324 80325 80326 80327 80328 80329 80330 80331 80332 80333 80334 80335 80336 80337 80338 80339 80340 80341 80342 80343 80344 80345 80346 80347 | } assert( zFile[0]!=0 ); rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset); offset += sqlite3Strlen30(zFile)+1; if( rc!=SQLITE_OK ){ sqlite3OsCloseFree(pMaster); sqlite3OsDelete(pVfs, zMaster, 0); sqlite3DbFree(db, zMaster-4); return rc; } } } /* Sync the master journal file. If the IOCAP_SEQUENTIAL device ** flag is set this is not required. */ if( 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL) && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL)) ){ sqlite3OsCloseFree(pMaster); sqlite3OsDelete(pVfs, zMaster, 0); sqlite3DbFree(db, zMaster-4); return rc; } /* Sync all the db files involved in the transaction. The same call ** sets the master journal pointer in each individual journal. If ** an error occurs here, do not delete the master journal file. ** |
80124 80125 80126 80127 80128 80129 80130 | if( pBt ){ rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); } } sqlite3OsCloseFree(pMaster); assert( rc!=SQLITE_BUSY ); if( rc!=SQLITE_OK ){ | | | | 80356 80357 80358 80359 80360 80361 80362 80363 80364 80365 80366 80367 80368 80369 80370 80371 80372 80373 80374 80375 80376 80377 80378 80379 | if( pBt ){ rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); } } sqlite3OsCloseFree(pMaster); assert( rc!=SQLITE_BUSY ); if( rc!=SQLITE_OK ){ sqlite3DbFree(db, zMaster-4); return rc; } /* Delete the master journal file. This commits the transaction. After ** doing this the directory is synced again before any individual ** transaction files are deleted. */ rc = sqlite3OsDelete(pVfs, zMaster, 1); sqlite3DbFree(db, zMaster-4); zMaster = 0; if( rc ){ return rc; } /* All files and directories have already been synced, so the following ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and |
80839 80840 80841 80842 80843 80844 80845 | ** not been deleted out from under the cursor, then this routine is a no-op. */ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ VdbeCursor *p = *pp; assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); if( p->deferredMoveto ){ int iMap; | | | 81071 81072 81073 81074 81075 81076 81077 81078 81079 81080 81081 81082 81083 81084 81085 | ** not been deleted out from under the cursor, then this routine is a no-op. */ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ VdbeCursor *p = *pp; assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); if( p->deferredMoveto ){ int iMap; if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 && !p->nullRow ){ *pp = p->pAltCursor; *piCol = iMap - 1; return SQLITE_OK; } return sqlite3VdbeFinishMoveto(p); } if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ |
81842 81843 81844 81845 81846 81847 81848 | rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); } } } /* RHS is a string */ else if( pRhs->flags & MEM_Str ){ | | | 82074 82075 82076 82077 82078 82079 82080 82081 82082 82083 82084 82085 82086 82087 82088 | rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); } } } /* RHS is a string */ else if( pRhs->flags & MEM_Str ){ getVarint32NR(&aKey1[idx1], serial_type); testcase( serial_type==12 ); if( serial_type<12 ){ rc = -1; }else if( !(serial_type & 0x01) ){ rc = +1; }else{ mem1.n = (serial_type - 12) / 2; |
81876 81877 81878 81879 81880 81881 81882 | } } } /* RHS is a blob */ else if( pRhs->flags & MEM_Blob ){ assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); | | | 82108 82109 82110 82111 82112 82113 82114 82115 82116 82117 82118 82119 82120 82121 82122 | } } } /* RHS is a blob */ else if( pRhs->flags & MEM_Blob ){ assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); getVarint32NR(&aKey1[idx1], serial_type); testcase( serial_type==12 ); if( serial_type<12 || (serial_type & 0x01) ){ rc = -1; }else{ int nStr = (serial_type - 12) / 2; testcase( (d1+nStr)==(unsigned)nKey1 ); testcase( (d1+nStr+1)==(unsigned)nKey1 ); |
82065 82066 82067 82068 82069 82070 82071 | ){ const u8 *aKey1 = (const u8*)pKey1; int serial_type; int res; assert( pPKey2->aMem[0].flags & MEM_Str ); vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); | > > | > | 82297 82298 82299 82300 82301 82302 82303 82304 82305 82306 82307 82308 82309 82310 82311 82312 82313 82314 | ){ const u8 *aKey1 = (const u8*)pKey1; int serial_type; int res; assert( pPKey2->aMem[0].flags & MEM_Str ); vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); serial_type = (u8)(aKey1[1]); if( serial_type >= 0x80 ){ sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); } if( serial_type<12 ){ res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ }else if( !(serial_type & 0x01) ){ res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ }else{ int nCmp; int nStr; |
82186 82187 82188 82189 82190 82191 82192 | */ assert( sqlite3BtreeCursorIsValid(pCur) ); nCellKey = sqlite3BtreePayloadSize(pCur); assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); /* Read in the complete content of the index entry */ sqlite3VdbeMemInit(&m, db, 0); | | | | | 82421 82422 82423 82424 82425 82426 82427 82428 82429 82430 82431 82432 82433 82434 82435 82436 82437 82438 82439 82440 82441 82442 82443 82444 82445 82446 82447 82448 82449 82450 82451 82452 | */ assert( sqlite3BtreeCursorIsValid(pCur) ); nCellKey = sqlite3BtreePayloadSize(pCur); assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); /* Read in the complete content of the index entry */ sqlite3VdbeMemInit(&m, db, 0); rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); if( rc ){ return rc; } /* The index entry must begin with a header size */ getVarint32NR((u8*)m.z, szHdr); testcase( szHdr==3 ); testcase( szHdr==m.n ); testcase( szHdr>0x7fffffff ); assert( m.n>=0 ); if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){ goto idx_rowid_corruption; } /* The last field of the index should be an integer - the ROWID. ** Verify that the last entry really is an integer. */ getVarint32NR((u8*)&m.z[szHdr-1], typeRowid); testcase( typeRowid==1 ); testcase( typeRowid==2 ); testcase( typeRowid==3 ); testcase( typeRowid==4 ); testcase( typeRowid==5 ); testcase( typeRowid==6 ); testcase( typeRowid==8 ); |
82268 82269 82270 82271 82272 82273 82274 | /* nCellKey will always be between 0 and 0xffffffff because of the way ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ if( nCellKey<=0 || nCellKey>0x7fffffff ){ *res = 0; return SQLITE_CORRUPT_BKPT; } sqlite3VdbeMemInit(&m, db, 0); | | | 82503 82504 82505 82506 82507 82508 82509 82510 82511 82512 82513 82514 82515 82516 82517 | /* nCellKey will always be between 0 and 0xffffffff because of the way ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ if( nCellKey<=0 || nCellKey>0x7fffffff ){ *res = 0; return SQLITE_CORRUPT_BKPT; } sqlite3VdbeMemInit(&m, db, 0); rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); if( rc ){ return rc; } *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); sqlite3VdbeMemRelease(&m); return SQLITE_OK; } |
83181 83182 83183 83184 83185 83186 83187 | } if( p->pc<0 ){ /* If there are no other statements currently running, then ** reset the interrupt flag. This prevents a call to sqlite3_interrupt ** from interrupting a statement that has not yet started. */ if( db->nVdbeActive==0 ){ | | | 83416 83417 83418 83419 83420 83421 83422 83423 83424 83425 83426 83427 83428 83429 83430 | } if( p->pc<0 ){ /* If there are no other statements currently running, then ** reset the interrupt flag. This prevents a call to sqlite3_interrupt ** from interrupting a statement that has not yet started. */ if( db->nVdbeActive==0 ){ AtomicStore(&db->u1.isInterrupted, 0); } assert( db->nVdbeWrite>0 || db->autoCommit==0 || (db->nDeferredCons==0 && db->nDeferredImmCons==0) ); #ifndef SQLITE_OMIT_TRACE |
83873 83874 83875 83876 83877 83878 83879 | sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. ** | | | 84108 84109 84110 84111 84112 84113 84114 84115 84116 84117 84118 84119 84120 84121 84122 | sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. ** ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host ** parameter in the WHERE clause might influence the choice of query plan ** for a statement, then the statement will be automatically recompiled, ** as if there had been a schema change, on the first sqlite3_step() call ** following any change to the bindings of that parameter. */ assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); if( p->expmask!=0 && (p->expmask & (i>=31 ? 0x80000000 : (u32)1<<i))!=0 ){ |
85566 85567 85568 85569 85570 85571 85572 | } assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); assert( p->bIsReader || p->readOnly!=0 ); p->iCurrentTime = 0; assert( p->explain==0 ); p->pResultSet = 0; db->busyHandler.nBusy = 0; | | | 85801 85802 85803 85804 85805 85806 85807 85808 85809 85810 85811 85812 85813 85814 85815 | } assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); assert( p->bIsReader || p->readOnly!=0 ); p->iCurrentTime = 0; assert( p->explain==0 ); p->pResultSet = 0; db->busyHandler.nBusy = 0; if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; sqlite3VdbeIOTraceSql(p); #ifdef SQLITE_DEBUG sqlite3BeginBenignMalloc(); if( p->pc==0 && (p->db->flags & (SQLITE_VdbeListing|SQLITE_VdbeEQP|SQLITE_VdbeTrace))!=0 ){ int i; |
85750 85751 85752 85753 85754 85755 85756 | ** ** This code uses unstructured "goto" statements and does not look clean. ** But that is not due to sloppy coding habits. The code is written this ** way for performance, to avoid having to run the interrupt and progress ** checks on every opcode. This helps sqlite3_step() to run about 1.5% ** faster according to "valgrind --tool=cachegrind" */ check_for_interrupt: | | | 85985 85986 85987 85988 85989 85990 85991 85992 85993 85994 85995 85996 85997 85998 85999 | ** ** This code uses unstructured "goto" statements and does not look clean. ** But that is not due to sloppy coding habits. The code is written this ** way for performance, to avoid having to run the interrupt and progress ** checks on every opcode. This helps sqlite3_step() to run about 1.5% ** faster according to "valgrind --tool=cachegrind" */ check_for_interrupt: if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; #ifndef SQLITE_OMIT_PROGRESS_CALLBACK /* Call the progress callback if it is configured and the required number ** of VDBE ops have been executed (either since this invocation of ** sqlite3VdbeExec() or since last time the progress callback was called). ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ |
86403 86404 86405 86406 86407 86408 86409 | i64 nByte; /* Total size of the output string or blob */ u16 flags1; /* Initial flags for P1 */ u16 flags2; /* Initial flags for P2 */ pIn1 = &aMem[pOp->p1]; pIn2 = &aMem[pOp->p2]; pOut = &aMem[pOp->p3]; | < | 86638 86639 86640 86641 86642 86643 86644 86645 86646 86647 86648 86649 86650 86651 | i64 nByte; /* Total size of the output string or blob */ u16 flags1; /* Initial flags for P1 */ u16 flags2; /* Initial flags for P2 */ pIn1 = &aMem[pOp->p1]; pIn2 = &aMem[pOp->p2]; pOut = &aMem[pOp->p3]; testcase( pOut==pIn2 ); assert( pIn1!=pOut ); flags1 = pIn1->flags; testcase( flags1 & MEM_Null ); testcase( pIn2->flags & MEM_Null ); if( (flags1 | pIn2->flags) & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); |
86934 86935 86936 86937 86938 86939 86940 | }else{ /* Neither operand is NULL. Do a comparison. */ affinity = pOp->p5 & SQLITE_AFF_MASK; if( affinity>=SQLITE_AFF_NUMERIC ){ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); | | | 87168 87169 87170 87171 87172 87173 87174 87175 87176 87177 87178 87179 87180 87181 87182 | }else{ /* Neither operand is NULL. Do a comparison. */ affinity = pOp->p5 & SQLITE_AFF_MASK; if( affinity>=SQLITE_AFF_NUMERIC ){ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); assert( flags3==pIn3->flags ); flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn3,0); } } /* Handle the common case of integer comparison here, as an |
86957 86958 86959 86960 86961 86962 86963 | if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_Real ); testcase( pIn1->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); | | | 87191 87192 87193 87194 87195 87196 87197 87198 87199 87200 87201 87202 87203 87204 87205 | if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_Real ); testcase( pIn1->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); if( NEVER(pIn1==pIn3) ) flags3 = flags1 | MEM_Str; } if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); testcase( pIn3->flags & MEM_IntReal ); sqlite3VdbeMemStringify(pIn3, encoding, 1); testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); |
87572 87573 87574 87575 87576 87577 87578 | /* If there is more header available for parsing in the record, try ** to extract additional fields up through the p2+1-th field */ if( pC->iHdrOffset<aOffset[0] ){ /* Make sure zData points to enough of the record to cover the header. */ if( pC->aRow==0 ){ memset(&sMem, 0, sizeof(sMem)); | | | 87806 87807 87808 87809 87810 87811 87812 87813 87814 87815 87816 87817 87818 87819 87820 | /* If there is more header available for parsing in the record, try ** to extract additional fields up through the p2+1-th field */ if( pC->iHdrOffset<aOffset[0] ){ /* Make sure zData points to enough of the record to cover the header. */ if( pC->aRow==0 ){ memset(&sMem, 0, sizeof(sMem)); rc = sqlite3VdbeMemFromBtreeZeroOffset(pC->uc.pCursor,aOffset[0],&sMem); if( rc!=SQLITE_OK ) goto abort_due_to_error; zData = (u8*)sMem.z; }else{ zData = pC->aRow; } /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ |
88047 88048 88049 88050 88051 88052 88053 | assert( nByte==(int)(zPayload - (u8*)pOut->z) ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); REGISTER_TRACE(pOp->p3, pOut); break; } | | | > > > > < > > > | | | > < | 88281 88282 88283 88284 88285 88286 88287 88288 88289 88290 88291 88292 88293 88294 88295 88296 88297 88298 88299 88300 88301 88302 88303 88304 88305 88306 88307 88308 88309 88310 88311 88312 88313 88314 88315 88316 88317 88318 88319 88320 88321 88322 | assert( nByte==(int)(zPayload - (u8*)pOut->z) ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); REGISTER_TRACE(pOp->p3, pOut); break; } /* Opcode: Count P1 P2 p3 * * ** Synopsis: r[P2]=count() ** ** Store the number of entries (an integer value) in the table or index ** opened by cursor P1 in register P2. ** ** If P3==0, then an exact count is obtained, which involves visiting ** every btree page of the table. But if P3 is non-zero, an estimate ** is returned based on the current cursor position. */ case OP_Count: { /* out2 */ i64 nEntry; BtCursor *pCrsr; assert( p->apCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); pCrsr = p->apCsr[pOp->p1]->uc.pCursor; assert( pCrsr ); if( pOp->p3 ){ nEntry = sqlite3BtreeRowCountEst(pCrsr); }else{ nEntry = 0; /* Not needed. Only used to silence a warning. */ rc = sqlite3BtreeCount(db, pCrsr, &nEntry); if( rc ) goto abort_due_to_error; } pOut = out2Prerelease(p, pOp); pOut->u.i = nEntry; goto check_for_interrupt; } /* Opcode: Savepoint P1 * * P4 * ** ** Open, release or rollback the savepoint named by parameter P4, depending ** on the value of P1. To open a new savepoint set P1==0 (SAVEPOINT_BEGIN). ** To release (commit) an existing savepoint set P1==1 (SAVEPOINT_RELEASE). ** To rollback an existing savepoint set P1==2 (SAVEPOINT_ROLLBACK). |
88524 88525 88526 88527 88528 88529 88530 | ** values need not be contiguous but all P1 values should be small integers. ** It is an error for P1 to be negative. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT | | | 88764 88765 88766 88767 88768 88769 88770 88771 88772 88773 88774 88775 88776 88777 88778 | ** values need not be contiguous but all P1 values should be small integers. ** It is an error for P1 to be negative. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT ** of OP_SeekLE/OP_IdxLT) ** </ul> ** ** The P4 value may be either an integer (P4_INT32) or a pointer to ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo ** object, then table being opened must be an [index b-tree] where the ** KeyInfo object defines the content and collating ** sequence of that index b-tree. Otherwise, if P4 is an integer |
88554 88555 88556 88557 88558 88559 88560 | ** be the same as every other ReopenIdx or OpenRead for the same cursor ** number. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT | | | 88794 88795 88796 88797 88798 88799 88800 88801 88802 88803 88804 88805 88806 88807 88808 | ** be the same as every other ReopenIdx or OpenRead for the same cursor ** number. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT ** of OP_SeekLE/OP_IdxLT) ** </ul> ** ** See also: OP_OpenRead, OP_OpenWrite */ /* Opcode: OpenWrite P1 P2 P3 P4 P5 ** Synopsis: root=P2 iDb=P3 ** |
88578 88579 88580 88581 88582 88583 88584 | ** value, then the table being opened must be a [table b-tree] with a ** number of columns no less than the value of P4. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT | | | 88818 88819 88820 88821 88822 88823 88824 88825 88826 88827 88828 88829 88830 88831 88832 | ** value, then the table being opened must be a [table b-tree] with a ** number of columns no less than the value of P4. ** ** Allowed P5 bits: ** <ul> ** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT ** of OP_SeekLE/OP_IdxLT) ** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek ** and subsequently delete entries in an index btree. This is a ** hint to the storage engine that the storage engine is allowed to ** ignore. The hint is not used by the official SQLite b*tree storage ** engine, but is used by COMDB2. ** <li> <b>0x10 OPFLAG_P2ISREG</b>: Use the content of register P2 ** as the root page, not the value of P2 itself. |
88690 88691 88692 88693 88694 88695 88696 | ** since moved into the btree layer. */ pCur->isTable = pOp->p4type!=P4_KEYINFO; open_cursor_set_hints: assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); testcase( pOp->p5 & OPFLAG_BULKCSR ); | < < | 88930 88931 88932 88933 88934 88935 88936 88937 88938 88939 88940 88941 88942 88943 88944 | ** since moved into the btree layer. */ pCur->isTable = pOp->p4type!=P4_KEYINFO; open_cursor_set_hints: assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); testcase( pOp->p5 & OPFLAG_BULKCSR ); testcase( pOp->p2 & OPFLAG_SEEKEQ ); sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); if( rc ) goto abort_due_to_error; break; } /* Opcode: OpenDup P1 P2 * * * |
88948 88949 88950 88951 88952 88953 88954 | ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this | | | | | | > > | | 89186 89187 89188 89189 89190 89191 89192 89193 89194 89195 89196 89197 89198 89199 89200 89201 89202 89203 89204 89205 89206 89207 89208 89209 89210 89211 89212 89213 89214 89215 89216 89217 89218 89219 89220 89221 89222 | ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this ** opcode will either land on a record that exactly matches the key, or ** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, ** this opcode must be followed by an IdxLE opcode with the same arguments. ** The IdxGT opcode will be skipped if this opcode succeeds, but the ** IdxGT opcode will be used on subsequent loop iterations. The ** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this ** is an equality search. ** ** This opcode leaves the cursor configured to move in forward order, ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. ** ** See also: Found, NotFound, SeekLt, SeekGt, SeekLe */ /* Opcode: SeekGT P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), ** use the value in register P3 as a key. If cursor P1 refers ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than the key value. If there are no records greater than ** the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in forward order, ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. ** |
89013 89014 89015 89016 89017 89018 89019 | ** less than or equal to the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in reverse order, ** from the end toward the beginning. In other words, the cursor is ** configured to use Prev, not Next. ** ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this | | | | | > > | 89253 89254 89255 89256 89257 89258 89259 89260 89261 89262 89263 89264 89265 89266 89267 89268 89269 89270 89271 89272 89273 | ** less than or equal to the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in reverse order, ** from the end toward the beginning. In other words, the cursor is ** configured to use Prev, not Next. ** ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this ** opcode will either land on a record that exactly matches the key, or ** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, ** this opcode must be followed by an IdxLE opcode with the same arguments. ** The IdxGE opcode will be skipped if this opcode succeeds, but the ** IdxGE opcode will be used on subsequent loop iterations. The ** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this ** is an equality search. ** ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt */ case OP_SeekLT: /* jump, in3, group */ case OP_SeekLE: /* jump, in3, group */ case OP_SeekGE: /* jump, in3, group */ case OP_SeekGT: { /* jump, in3, group */ |
89054 89055 89056 89057 89058 89059 89060 | pC->seekOp = pOp->opcode; #endif pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; if( pC->isTable ){ u16 flags3, newType; | | | 89296 89297 89298 89299 89300 89301 89302 89303 89304 89305 89306 89307 89308 89309 89310 | pC->seekOp = pOp->opcode; #endif pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; if( pC->isTable ){ u16 flags3, newType; /* The OPFLAG_SEEKEQ/BTREE_SEEK_EQ flag is only set on index cursors */ assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 || CORRUPT_DB ); /* The input value in P3 might be of any type: integer, real, string, ** blob, or NULL. But it needs to be an integer before we can do ** the seek, so convert it. */ pIn3 = &aMem[pOp->p3]; |
89113 89114 89115 89116 89117 89118 89119 | } rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); pC->movetoTarget = iKey; /* Used by OP_Delete */ if( rc!=SQLITE_OK ){ goto abort_due_to_error; } }else{ | | | | > > > | 89355 89356 89357 89358 89359 89360 89361 89362 89363 89364 89365 89366 89367 89368 89369 89370 89371 89372 89373 89374 89375 89376 89377 89378 89379 | } rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); pC->movetoTarget = iKey; /* Used by OP_Delete */ if( rc!=SQLITE_OK ){ goto abort_due_to_error; } }else{ /* For a cursor with the OPFLAG_SEEKEQ/BTREE_SEEK_EQ hint, only the ** OP_SeekGE and OP_SeekLE opcodes are allowed, and these must be ** immediately followed by an OP_IdxGT or OP_IdxLT opcode, respectively, ** with the same key. */ if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ eqOnly = 1; assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); assert( pOp->opcode==OP_SeekGE || pOp[1].opcode==OP_IdxLT ); assert( pOp->opcode==OP_SeekLE || pOp[1].opcode==OP_IdxGT ); assert( pOp[1].p1==pOp[0].p1 ); assert( pOp[1].p2==pOp[0].p2 ); assert( pOp[1].p3==pOp[0].p3 ); assert( pOp[1].p4.i==pOp[0].p4.i ); } nField = pOp->p4.i; |
90068 90069 90070 90071 90072 90073 90074 | #endif n = sqlite3BtreePayloadSize(pCrsr); if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } testcase( n==0 ); | | | 90313 90314 90315 90316 90317 90318 90319 90320 90321 90322 90323 90324 90325 90326 90327 | #endif n = sqlite3BtreePayloadSize(pCrsr); if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } testcase( n==0 ); rc = sqlite3VdbeMemFromBtreeZeroOffset(pCrsr, n, pOut); if( rc ) goto abort_due_to_error; if( !pOp->p3 ) Deephemeralize(pOut); UPDATE_MAX_BLOBSIZE(pOut); REGISTER_TRACE(pOp->p2, pOut); break; } |
90446 90447 90448 90449 90450 90451 90452 | ** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior ** seeks on the cursor or if the most recent seek used a key equivalent ** to P2. ** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. */ | < < < < < < < < | | < < < | | | | | | | | | | > > | > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > < > > > | 90691 90692 90693 90694 90695 90696 90697 90698 90699 90700 90701 90702 90703 90704 90705 90706 90707 90708 90709 90710 90711 90712 90713 90714 90715 90716 90717 90718 90719 90720 90721 90722 90723 90724 90725 90726 90727 90728 90729 90730 90731 90732 90733 90734 90735 90736 90737 90738 90739 90740 90741 90742 90743 90744 90745 90746 90747 90748 90749 90750 90751 90752 90753 90754 90755 90756 90757 90758 90759 90760 90761 90762 90763 90764 90765 90766 90767 90768 90769 90770 90771 90772 90773 90774 90775 90776 90777 90778 90779 90780 90781 90782 90783 90784 90785 90786 90787 90788 90789 90790 90791 90792 90793 90794 90795 90796 90797 90798 90799 90800 | ** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior ** seeks on the cursor or if the most recent seek used a key equivalent ** to P2. ** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. */ case OP_IdxInsert: { /* in2 */ VdbeCursor *pC; BtreePayload x; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; sqlite3VdbeIncrWriteCounter(p, pC); assert( pC!=0 ); assert( !isSorter(pC) ); pIn2 = &aMem[pOp->p2]; assert( pIn2->flags & MEM_Blob ); if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->isTable==0 ); rc = ExpandBlob(pIn2); if( rc ) goto abort_due_to_error; x.nKey = pIn2->n; x.pKey = pIn2->z; x.aMem = aMem + pOp->p3; x.nMem = (u16)pOp->p4.i; rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) ); assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; if( rc) goto abort_due_to_error; break; } /* Opcode: SorterInsert P1 P2 * * * ** Synopsis: key=r[P2] ** ** Register P2 holds an SQL index key made using the ** MakeRecord instructions. This opcode writes that key ** into the sorter P1. Data for the entry is nil. */ case OP_SorterInsert: { /* in2 */ VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; sqlite3VdbeIncrWriteCounter(p, pC); assert( pC!=0 ); assert( isSorter(pC) ); pIn2 = &aMem[pOp->p2]; assert( pIn2->flags & MEM_Blob ); assert( pC->isTable==0 ); rc = ExpandBlob(pIn2); if( rc ) goto abort_due_to_error; rc = sqlite3VdbeSorterWrite(pC, pIn2); if( rc) goto abort_due_to_error; break; } /* Opcode: IdxDelete P1 P2 P3 * P5 ** Synopsis: key=r[P2@P3] ** ** The content of P3 registers starting at register P2 form ** an unpacked index key. This opcode removes that entry from the ** index opened by cursor P1. ** ** If P5 is not zero, then raise an SQLITE_CORRUPT_INDEX error ** if no matching index entry is found. This happens when running ** an UPDATE or DELETE statement and the index entry to be updated ** or deleted is not found. For some uses of IdxDelete ** (example: the EXCEPT operator) it does not matter that no matching ** entry is found. For those cases, P5 is zero. */ case OP_IdxDelete: { VdbeCursor *pC; BtCursor *pCrsr; int res; UnpackedRecord r; assert( pOp->p3>0 ); assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem+1 - p->nCursor)+1 ); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->eCurType==CURTYPE_BTREE ); sqlite3VdbeIncrWriteCounter(p, pC); pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p3; r.default_rc = 0; r.aMem = &aMem[pOp->p2]; rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res); if( rc ) goto abort_due_to_error; if( res==0 ){ rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); if( rc ) goto abort_due_to_error; }else if( pOp->p5 ){ rc = SQLITE_CORRUPT_INDEX; goto abort_due_to_error; } assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; pC->seekResult = 0; break; } |
91322 91323 91324 91325 91326 91327 91328 | #ifdef SQLITE_DEBUG /* Verify that second and subsequent executions of the same trigger do not ** try to reuse register values from the first use. */ { int i; for(i=0; i<p->nMem; i++){ aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ | | | 91589 91590 91591 91592 91593 91594 91595 91596 91597 91598 91599 91600 91601 91602 91603 | #ifdef SQLITE_DEBUG /* Verify that second and subsequent executions of the same trigger do not ** try to reuse register values from the first use. */ { int i; for(i=0; i<p->nMem; i++){ aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ MemSetTypeFlag(&aMem[i], MEM_Undefined); /* Fault if this reg is reused */ } } #endif pOp = &aOp[-1]; goto check_for_interrupt; } |
92433 92434 92435 92436 92437 92438 92439 | } pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax); break; } #endif /* Opcode: Function P1 P2 P3 P4 * | | | | 92700 92701 92702 92703 92704 92705 92706 92707 92708 92709 92710 92711 92712 92713 92714 92715 92716 92717 92718 92719 92720 92721 92722 92723 92724 92725 92726 92727 92728 92729 92730 92731 92732 92733 | } pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax); break; } #endif /* Opcode: Function P1 P2 P3 P4 * ** Synopsis: r[P3]=func(r[P2@NP]) ** ** Invoke a user function (P4 is a pointer to an sqlite3_context object that ** contains a pointer to the function to be run) with arguments taken ** from register P2 and successors. The number of arguments is in ** the sqlite3_context object that P4 points to. ** The result of the function is stored ** in register P3. Register P3 must not be one of the function inputs. ** ** P1 is a 32-bit bitmask indicating whether or not each argument to the ** function was determined to be constant at compile time. If the first ** argument was constant then bit 0 of P1 is set. This is used to determine ** whether meta data associated with a user function argument using the ** sqlite3_set_auxdata() API may be safely retained until the next ** invocation of this opcode. ** ** See also: AggStep, AggFinal, PureFunc */ /* Opcode: PureFunc P1 P2 P3 P4 * ** Synopsis: r[P3]=func(r[P2@NP]) ** ** Invoke a user function (P4 is a pointer to an sqlite3_context object that ** contains a pointer to the function to be run) with arguments taken ** from register P2 and successors. The number of arguments is in ** the sqlite3_context object that P4 points to. ** The result of the function is stored ** in register P3. Register P3 must not be one of the function inputs. |
92841 92842 92843 92844 92845 92846 92847 | rc = SQLITE_NOMEM_BKPT; goto abort_due_to_error; /* Jump to here if the sqlite3_interrupt() API sets the interrupt ** flag. */ abort_due_to_interrupt: | | | 93108 93109 93110 93111 93112 93113 93114 93115 93116 93117 93118 93119 93120 93121 93122 | rc = SQLITE_NOMEM_BKPT; goto abort_due_to_error; /* Jump to here if the sqlite3_interrupt() API sets the interrupt ** flag. */ abort_due_to_interrupt: assert( AtomicLoad(&db->u1.isInterrupted) ); rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; p->rc = rc; sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); goto abort_due_to_error; } |
94179 94180 94181 94182 94183 94184 94185 | const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ int n1; int n2; int res; | | | | 94446 94447 94448 94449 94450 94451 94452 94453 94454 94455 94456 94457 94458 94459 94460 94461 | const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ int n1; int n2; int res; getVarint32NR(&p1[1], n1); getVarint32NR(&p2[1], n2); res = memcmp(v1, v2, (MIN(n1, n2) - 13)/2); if( res==0 ){ res = n1 - n2; } if( res==0 ){ if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ |
95137 95138 95139 95140 95141 95142 95143 | int bFlush; /* True to flush contents of memory to PMA */ int nReq; /* Bytes of memory required */ int nPMA; /* Bytes of PMA space required */ int t; /* serial type of first record field */ assert( pCsr->eCurType==CURTYPE_SORTER ); pSorter = pCsr->uc.pSorter; | | | 95404 95405 95406 95407 95408 95409 95410 95411 95412 95413 95414 95415 95416 95417 95418 | int bFlush; /* True to flush contents of memory to PMA */ int nReq; /* Bytes of memory required */ int nPMA; /* Bytes of PMA space required */ int t; /* serial type of first record field */ assert( pCsr->eCurType==CURTYPE_SORTER ); pSorter = pCsr->uc.pSorter; getVarint32NR((const u8*)&pVal->z[1], t); if( t>0 && t<10 && t!=7 ){ pSorter->typeMask &= SORTER_TYPE_INTEGER; }else if( t>10 && (t & 0x01) ){ pSorter->typeMask &= SORTER_TYPE_TEXT; }else{ pSorter->typeMask = 0; } |
96124 96125 96126 96127 96128 96129 96130 96131 96132 96133 96134 96135 96136 96137 | } *pRes = sqlite3VdbeRecordCompare(pVal->n, pVal->z, r2); return SQLITE_OK; } /************** End of vdbesort.c ********************************************/ /************** Begin file memjournal.c **************************************/ /* ** 2008 October 7 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 96391 96392 96393 96394 96395 96396 96397 96398 96399 96400 96401 96402 96403 96404 96405 96406 96407 96408 96409 96410 96411 96412 96413 96414 96415 96416 96417 96418 96419 96420 96421 96422 96423 96424 96425 96426 96427 96428 96429 96430 96431 96432 96433 96434 96435 96436 96437 96438 96439 96440 96441 96442 96443 96444 96445 96446 96447 96448 96449 96450 96451 96452 96453 96454 96455 96456 96457 96458 96459 96460 96461 96462 96463 96464 96465 96466 96467 96468 96469 96470 96471 96472 96473 96474 96475 96476 96477 96478 96479 96480 96481 96482 96483 96484 96485 96486 96487 96488 96489 96490 96491 96492 96493 96494 96495 96496 96497 96498 96499 96500 96501 96502 96503 96504 96505 96506 96507 96508 96509 96510 96511 96512 96513 96514 96515 96516 96517 96518 96519 96520 96521 96522 96523 96524 96525 96526 96527 96528 96529 96530 96531 96532 96533 96534 96535 96536 96537 96538 96539 96540 96541 96542 96543 96544 96545 96546 96547 96548 96549 96550 96551 96552 96553 96554 96555 96556 96557 96558 96559 96560 96561 96562 96563 96564 96565 96566 96567 96568 96569 96570 96571 96572 96573 96574 96575 96576 96577 96578 96579 96580 96581 96582 96583 96584 96585 96586 96587 96588 96589 96590 96591 96592 96593 96594 96595 96596 96597 96598 96599 96600 96601 96602 96603 96604 96605 96606 96607 96608 96609 96610 96611 96612 96613 96614 96615 96616 96617 96618 96619 96620 96621 96622 96623 96624 96625 96626 96627 96628 96629 96630 96631 96632 96633 96634 96635 96636 96637 96638 96639 96640 96641 96642 96643 96644 96645 96646 96647 96648 96649 96650 96651 96652 96653 96654 96655 96656 96657 96658 96659 96660 96661 96662 96663 96664 96665 96666 96667 96668 96669 96670 96671 96672 96673 96674 96675 96676 96677 96678 96679 96680 96681 96682 96683 96684 96685 96686 96687 96688 96689 96690 96691 96692 96693 96694 96695 96696 96697 96698 96699 96700 96701 96702 96703 96704 96705 96706 96707 96708 96709 96710 96711 96712 96713 96714 96715 96716 96717 96718 96719 96720 96721 96722 96723 96724 96725 96726 96727 96728 96729 96730 96731 96732 96733 96734 96735 96736 96737 96738 96739 96740 96741 96742 96743 96744 96745 96746 96747 96748 96749 96750 96751 96752 96753 96754 96755 96756 96757 96758 96759 96760 96761 96762 96763 96764 96765 96766 96767 96768 96769 96770 96771 96772 96773 96774 96775 96776 96777 96778 96779 96780 96781 96782 96783 96784 96785 96786 96787 96788 96789 96790 96791 96792 96793 96794 96795 96796 96797 96798 96799 96800 96801 96802 96803 96804 96805 96806 96807 96808 96809 96810 96811 96812 96813 96814 96815 96816 96817 96818 96819 96820 96821 96822 96823 96824 96825 96826 96827 96828 96829 96830 96831 | } *pRes = sqlite3VdbeRecordCompare(pVal->n, pVal->z, r2); return SQLITE_OK; } /************** End of vdbesort.c ********************************************/ /************** Begin file vdbevtab.c ****************************************/ /* ** 2020-03-23 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** ** This file implements virtual-tables for examining the bytecode content ** of a prepared statement. */ /* #include "sqliteInt.h" */ #if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) /* #include "vdbeInt.h" */ /* An instance of the bytecode() table-valued function. */ typedef struct bytecodevtab bytecodevtab; struct bytecodevtab { sqlite3_vtab base; /* Base class - must be first */ sqlite3 *db; /* Database connection */ int bTablesUsed; /* 2 for tables_used(). 0 for bytecode(). */ }; /* A cursor for scanning through the bytecode */ typedef struct bytecodevtab_cursor bytecodevtab_cursor; struct bytecodevtab_cursor { sqlite3_vtab_cursor base; /* Base class - must be first */ sqlite3_stmt *pStmt; /* The statement whose bytecode is displayed */ int iRowid; /* The rowid of the output table */ int iAddr; /* Address */ int needFinalize; /* Cursors owns pStmt and must finalize it */ int showSubprograms; /* Provide a listing of subprograms */ Op *aOp; /* Operand array */ char *zP4; /* Rendered P4 value */ const char *zType; /* tables_used.type */ const char *zSchema; /* tables_used.schema */ const char *zName; /* tables_used.name */ Mem sub; /* Subprograms */ }; /* ** Create a new bytecode() table-valued function. */ static int bytecodevtabConnect( sqlite3 *db, void *pAux, int argc, const char *const*argv, sqlite3_vtab **ppVtab, char **pzErr ){ bytecodevtab *pNew; int rc; int isTabUsed = pAux!=0; const char *azSchema[2] = { /* bytecode() schema */ "CREATE TABLE x(" "addr INT," "opcode TEXT," "p1 INT," "p2 INT," "p3 INT," "p4 TEXT," "p5 INT," "comment TEXT," "subprog TEXT," "stmt HIDDEN" ");", /* Tables_used() schema */ "CREATE TABLE x(" "type TEXT," "schema TEXT," "name TEXT," "wr INT," "subprog TEXT," "stmt HIDDEN" ");" }; rc = sqlite3_declare_vtab(db, azSchema[isTabUsed]); if( rc==SQLITE_OK ){ pNew = sqlite3_malloc( sizeof(*pNew) ); *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); pNew->db = db; pNew->bTablesUsed = isTabUsed*2; } return rc; } /* ** This method is the destructor for bytecodevtab objects. */ static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ bytecodevtab *p = (bytecodevtab*)pVtab; sqlite3_free(p); return SQLITE_OK; } /* ** Constructor for a new bytecodevtab_cursor object. */ static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ bytecodevtab *pVTab = (bytecodevtab*)p; bytecodevtab_cursor *pCur; pCur = sqlite3_malloc( sizeof(*pCur) ); if( pCur==0 ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); sqlite3VdbeMemInit(&pCur->sub, pVTab->db, 1); *ppCursor = &pCur->base; return SQLITE_OK; } /* ** Clear all internal content from a bytecodevtab cursor. */ static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ sqlite3_free(pCur->zP4); pCur->zP4 = 0; sqlite3VdbeMemRelease(&pCur->sub); sqlite3VdbeMemSetNull(&pCur->sub); if( pCur->needFinalize ){ sqlite3_finalize(pCur->pStmt); } pCur->pStmt = 0; pCur->needFinalize = 0; pCur->zType = 0; pCur->zSchema = 0; pCur->zName = 0; } /* ** Destructor for a bytecodevtab_cursor. */ static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; bytecodevtabCursorClear(pCur); sqlite3_free(pCur); return SQLITE_OK; } /* ** Advance a bytecodevtab_cursor to its next row of output. */ static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; bytecodevtab *pTab = (bytecodevtab*)cur->pVtab; int rc; if( pCur->zP4 ){ sqlite3_free(pCur->zP4); pCur->zP4 = 0; } if( pCur->zName ){ pCur->zName = 0; pCur->zType = 0; pCur->zSchema = 0; } rc = sqlite3VdbeNextOpcode( (Vdbe*)pCur->pStmt, pCur->showSubprograms ? &pCur->sub : 0, pTab->bTablesUsed, &pCur->iRowid, &pCur->iAddr, &pCur->aOp); if( rc!=SQLITE_OK ){ sqlite3VdbeMemSetNull(&pCur->sub); pCur->aOp = 0; } return SQLITE_OK; } /* ** Return TRUE if the cursor has been moved off of the last ** row of output. */ static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; return pCur->aOp==0; } /* ** Return values of columns for the row at which the bytecodevtab_cursor ** is currently pointing. */ static int bytecodevtabColumn( sqlite3_vtab_cursor *cur, /* The cursor */ sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ int i /* Which column to return */ ){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; bytecodevtab *pVTab = (bytecodevtab*)cur->pVtab; Op *pOp = pCur->aOp + pCur->iAddr; if( pVTab->bTablesUsed ){ if( i==4 ){ i = 8; }else{ if( i<=2 && pCur->zType==0 ){ Schema *pSchema; HashElem *k; int iDb = pOp->p3; int iRoot = pOp->p2; sqlite3 *db = pVTab->db; pSchema = db->aDb[iDb].pSchema; pCur->zSchema = db->aDb[iDb].zDbSName; for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ Table *pTab = (Table*)sqliteHashData(k); if( !IsVirtual(pTab) && pTab->tnum==iRoot ){ pCur->zName = pTab->zName; pCur->zType = "table"; break; } } if( pCur->zName==0 ){ for(k=sqliteHashFirst(&pSchema->idxHash); k; k=sqliteHashNext(k)){ Index *pIdx = (Index*)sqliteHashData(k); if( pIdx->tnum==iRoot ){ pCur->zName = pIdx->zName; pCur->zType = "index"; } } } } i += 10; } } switch( i ){ case 0: /* addr */ sqlite3_result_int(ctx, pCur->iAddr); break; case 1: /* opcode */ sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), -1, SQLITE_STATIC); break; case 2: /* p1 */ sqlite3_result_int(ctx, pOp->p1); break; case 3: /* p2 */ sqlite3_result_int(ctx, pOp->p2); break; case 4: /* p3 */ sqlite3_result_int(ctx, pOp->p3); break; case 5: /* p4 */ case 7: /* comment */ if( pCur->zP4==0 ){ pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); } if( i==5 ){ sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); }else{ #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); sqlite3_result_text(ctx, zCom, -1, sqlite3_free); #endif } break; case 6: /* p5 */ sqlite3_result_int(ctx, pOp->p5); break; case 8: { /* subprog */ Op *aOp = pCur->aOp; assert( aOp[0].opcode==OP_Init ); assert( aOp[0].p4.z==0 || strncmp(aOp[0].p4.z,"-" "- ",3)==0 ); if( pCur->iRowid==pCur->iAddr+1 ){ break; /* Result is NULL for the main program */ }else if( aOp[0].p4.z!=0 ){ sqlite3_result_text(ctx, aOp[0].p4.z+3, -1, SQLITE_STATIC); }else{ sqlite3_result_text(ctx, "(FK)", 4, SQLITE_STATIC); } break; } case 10: /* tables_used.type */ sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); break; case 11: /* tables_used.schema */ sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); break; case 12: /* tables_used.name */ sqlite3_result_text(ctx, pCur->zName, -1, SQLITE_STATIC); break; case 13: /* tables_used.wr */ sqlite3_result_int(ctx, pOp->opcode==OP_OpenWrite); break; } return SQLITE_OK; } /* ** Return the rowid for the current row. In this implementation, the ** rowid is the same as the output value. */ static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; *pRowid = pCur->iRowid; return SQLITE_OK; } /* ** Initialize a cursor. ** ** idxNum==0 means show all subprograms ** idxNum==1 means show only the main bytecode and omit subprograms. */ static int bytecodevtabFilter( sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor; bytecodevtab *pVTab = (bytecodevtab *)pVtabCursor->pVtab; int rc = SQLITE_OK; bytecodevtabCursorClear(pCur); pCur->iRowid = 0; pCur->iAddr = 0; pCur->showSubprograms = idxNum==0; assert( argc==1 ); if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ const char *zSql = (const char*)sqlite3_value_text(argv[0]); if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ rc = sqlite3_prepare_v2(pVTab->db, zSql, -1, &pCur->pStmt, 0); pCur->needFinalize = 1; } }else{ pCur->pStmt = (sqlite3_stmt*)sqlite3_value_pointer(argv[0],"stmt-pointer"); } if( pCur->pStmt==0 ){ pVTab->base.zErrMsg = sqlite3_mprintf( "argument to %s() is not a valid SQL statement", pVTab->bTablesUsed ? "tables_used" : "bytecode" ); rc = SQLITE_ERROR; }else{ bytecodevtabNext(pVtabCursor); } return rc; } /* ** We must have a single stmt=? constraint that will be passed through ** into the xFilter method. If there is no valid stmt=? constraint, ** then return an SQLITE_CONSTRAINT error. */ static int bytecodevtabBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ int i; int rc = SQLITE_CONSTRAINT; struct sqlite3_index_constraint *p; bytecodevtab *pVTab = (bytecodevtab*)tab; int iBaseCol = pVTab->bTablesUsed ? 4 : 8; pIdxInfo->estimatedCost = (double)100; pIdxInfo->estimatedRows = 100; pIdxInfo->idxNum = 0; for(i=0, p=pIdxInfo->aConstraint; i<pIdxInfo->nConstraint; i++, p++){ if( p->usable==0 ) continue; if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==iBaseCol+1 ){ rc = SQLITE_OK; pIdxInfo->aConstraintUsage[i].omit = 1; pIdxInfo->aConstraintUsage[i].argvIndex = 1; } if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==iBaseCol ){ pIdxInfo->aConstraintUsage[i].omit = 1; pIdxInfo->idxNum = 1; } } return rc; } /* ** This following structure defines all the methods for the ** virtual table. */ static sqlite3_module bytecodevtabModule = { /* iVersion */ 0, /* xCreate */ 0, /* xConnect */ bytecodevtabConnect, /* xBestIndex */ bytecodevtabBestIndex, /* xDisconnect */ bytecodevtabDisconnect, /* xDestroy */ 0, /* xOpen */ bytecodevtabOpen, /* xClose */ bytecodevtabClose, /* xFilter */ bytecodevtabFilter, /* xNext */ bytecodevtabNext, /* xEof */ bytecodevtabEof, /* xColumn */ bytecodevtabColumn, /* xRowid */ bytecodevtabRowid, /* xUpdate */ 0, /* xBegin */ 0, /* xSync */ 0, /* xCommit */ 0, /* xRollback */ 0, /* xFindMethod */ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ 0, /* xShadowName */ 0 }; SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ int rc; rc = sqlite3_create_module(db, "bytecode", &bytecodevtabModule, 0); if( rc==SQLITE_OK ){ rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db); } return rc; } #elif defined(SQLITE_ENABLE_BYTECODE_VTAB) SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; } #endif /* SQLITE_ENABLE_BYTECODE_VTAB */ /************** End of vdbevtab.c ********************************************/ /************** Begin file memjournal.c **************************************/ /* ** 2008 October 7 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** |
96715 96716 96717 96718 96719 96720 96721 | */ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ SrcList *pSrc; int i; struct SrcList_item *pItem; pSrc = p->pSrc; | | | | | | | | | | > | 97409 97410 97411 97412 97413 97414 97415 97416 97417 97418 97419 97420 97421 97422 97423 97424 97425 97426 97427 97428 97429 97430 97431 97432 | */ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ SrcList *pSrc; int i; struct SrcList_item *pItem; pSrc = p->pSrc; if( pSrc ){ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ return WRC_Abort; } if( pItem->fg.isTabFunc && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg) ){ return WRC_Abort; } } } return WRC_Continue; } /* ** Call sqlite3WalkExpr() for every expression in Select statement p. |
96910 96911 96912 96913 96914 96915 96916 | const struct ExprList_item *pItem, const char *zCol, const char *zTab, const char *zDb ){ int n; const char *zSpan; | | | 97605 97606 97607 97608 97609 97610 97611 97612 97613 97614 97615 97616 97617 97618 97619 | const struct ExprList_item *pItem, const char *zCol, const char *zTab, const char *zDb ){ int n; const char *zSpan; if( pItem->eEName!=ENAME_TAB ) return 0; zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ return 0; } zSpan += n+1; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} |
96944 96945 96946 96947 96948 96949 96950 96951 96952 96953 96954 96955 96956 96957 | } return (db->flags & SQLITE_DqsDDL)!=0; }else{ /* Currently parsing a DML statement */ return (db->flags & SQLITE_DqsDML)!=0; } } /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column. The following changes ** are made to pExpr: ** | > > > > > > > > > > > > > > > > > > > > > > > > > | 97639 97640 97641 97642 97643 97644 97645 97646 97647 97648 97649 97650 97651 97652 97653 97654 97655 97656 97657 97658 97659 97660 97661 97662 97663 97664 97665 97666 97667 97668 97669 97670 97671 97672 97673 97674 97675 97676 97677 | } return (db->flags & SQLITE_DqsDDL)!=0; }else{ /* Currently parsing a DML statement */ return (db->flags & SQLITE_DqsDML)!=0; } } /* ** The argument is guaranteed to be a non-NULL Expr node of type TK_COLUMN. ** return the appropriate colUsed mask. */ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ int n; Table *pExTab; n = pExpr->iColumn; pExTab = pExpr->y.pTab; assert( pExTab!=0 ); if( (pExTab->tabFlags & TF_HasGenerated)!=0 && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 ){ testcase( pExTab->nCol==BMS-1 ); testcase( pExTab->nCol==BMS ); return pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; }else{ testcase( n==BMS-1 ); testcase( n==BMS ); if( n>=BMS ) n = BMS-1; return ((Bitmask)1)<<n; } } /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column. The following changes ** are made to pExpr: ** |
97022 97023 97024 97025 97026 97027 97028 97029 97030 97031 97032 97033 97034 97035 97036 97037 97038 97039 97040 97041 97042 97043 97044 97045 97046 | for(i=0; i<db->nDb; i++){ assert( db->aDb[i].zDbSName ); if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ pSchema = db->aDb[i].pSchema; break; } } } } /* Start at the inner-most context and move outward until a match is found */ assert( pNC && cnt==0 ); do{ ExprList *pEList; SrcList *pSrcList = pNC->pSrcList; if( pSrcList ){ for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){ pTab = pItem->pTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 ); if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ int hit = 0; pEList = pItem->pSelect->pEList; for(j=0; j<pEList->nExpr; j++){ | > > > > > > > | 97742 97743 97744 97745 97746 97747 97748 97749 97750 97751 97752 97753 97754 97755 97756 97757 97758 97759 97760 97761 97762 97763 97764 97765 97766 97767 97768 97769 97770 97771 97772 97773 | for(i=0; i<db->nDb; i++){ assert( db->aDb[i].zDbSName ); if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ pSchema = db->aDb[i].pSchema; break; } } if( i==db->nDb && sqlite3StrICmp("main", zDb)==0 ){ /* This branch is taken when the main database has been renamed ** using SQLITE_DBCONFIG_MAINDBNAME. */ pSchema = db->aDb[0].pSchema; zDb = db->aDb[0].zDbSName; } } } /* Start at the inner-most context and move outward until a match is found */ assert( pNC && cnt==0 ); do{ ExprList *pEList; SrcList *pSrcList = pNC->pSrcList; if( pSrcList ){ for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){ u8 hCol; pTab = pItem->pTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 ); if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ int hit = 0; pEList = pItem->pSelect->pEList; for(j=0; j<pEList->nExpr; j++){ |
97066 97067 97068 97069 97070 97071 97072 97073 | if( IN_RENAME_OBJECT && pItem->zAlias ){ sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } if( 0==(cntTab++) ){ pMatch = pItem; } for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ | > | | 97793 97794 97795 97796 97797 97798 97799 97800 97801 97802 97803 97804 97805 97806 97807 97808 97809 | if( IN_RENAME_OBJECT && pItem->zAlias ){ sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } if( 0==(cntTab++) ){ pMatch = pItem; } hCol = sqlite3StrIHash(zCol); for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ /* If there has been exactly one prior match and this match ** is for the right-hand table of a NATURAL JOIN or is in a ** USING clause, then skip this match. */ if( cnt==1 ){ if( pItem->fg.jointype & JT_NATURAL ) continue; if( nameInUsingClause(pItem->pUsing, zCol) ) continue; |
97128 97129 97130 97131 97132 97133 97134 97135 97136 97137 | pExpr->iTable = 2; } } #endif /* SQLITE_OMIT_UPSERT */ if( pTab ){ int iCol; pSchema = pTab->pSchema; cntTab++; for(iCol=0, pCol=pTab->aCol; iCol<pTab->nCol; iCol++, pCol++){ | > | | 97856 97857 97858 97859 97860 97861 97862 97863 97864 97865 97866 97867 97868 97869 97870 97871 97872 97873 97874 | pExpr->iTable = 2; } } #endif /* SQLITE_OMIT_UPSERT */ if( pTab ){ int iCol; u8 hCol = sqlite3StrIHash(zCol); pSchema = pTab->pSchema; cntTab++; for(iCol=0, pCol=pTab->aCol; iCol<pTab->nCol; iCol++, pCol++){ if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ if( iCol==pTab->iPKey ){ iCol = -1; } break; } } if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ |
97341 97342 97343 97344 97345 97346 97347 | ** avoid setting bits beyond the maximum column number of the table. ** (See ticket [b92e5e8ec2cdbaa1]). ** ** If a generated column is referenced, set bits for every column ** of the table. */ if( pExpr->iColumn>=0 && pMatch!=0 ){ | < < < < < < < < < < < < < < | < | 98070 98071 98072 98073 98074 98075 98076 98077 98078 98079 98080 98081 98082 98083 98084 | ** avoid setting bits beyond the maximum column number of the table. ** (See ticket [b92e5e8ec2cdbaa1]). ** ** If a generated column is referenced, set bits for every column ** of the table. */ if( pExpr->iColumn>=0 && pMatch!=0 ){ pMatch->colUsed |= sqlite3ExprColUsed(pExpr); } /* Clean up and return */ sqlite3ExprDelete(db, pExpr->pLeft); pExpr->pLeft = 0; sqlite3ExprDelete(db, pExpr->pRight); |
97821 97822 97823 97824 97825 97826 97827 | } case TK_IS: case TK_ISNOT: { Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); assert( !ExprHasProperty(pExpr, EP_Reduced) ); /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", ** and "x IS NOT FALSE". */ | | | 98535 98536 98537 98538 98539 98540 98541 98542 98543 98544 98545 98546 98547 98548 98549 | } case TK_IS: case TK_ISNOT: { Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); assert( !ExprHasProperty(pExpr, EP_Reduced) ); /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", ** and "x IS NOT FALSE". */ if( pRight && pRight->op==TK_ID ){ int rc = resolveExprStep(pWalker, pRight); if( rc==WRC_Abort ) return WRC_Abort; if( pRight->op==TK_TRUEFALSE ){ pExpr->op2 = pExpr->op; pExpr->op = TK_TRUTH; return WRC_Continue; } |
98582 98583 98584 98585 98586 98587 98588 | ** list rather than a single expression. */ SQLITE_PRIVATE int sqlite3ResolveExprListNames( NameContext *pNC, /* Namespace to resolve expressions in. */ ExprList *pList /* The expression list to be analyzed. */ ){ int i; | > > | > > > > > > > | > > > > > | > > > > > > > > > > > > > | > > > | 99296 99297 99298 99299 99300 99301 99302 99303 99304 99305 99306 99307 99308 99309 99310 99311 99312 99313 99314 99315 99316 99317 99318 99319 99320 99321 99322 99323 99324 99325 99326 99327 99328 99329 99330 99331 99332 99333 99334 99335 99336 99337 99338 99339 99340 99341 99342 99343 99344 | ** list rather than a single expression. */ SQLITE_PRIVATE int sqlite3ResolveExprListNames( NameContext *pNC, /* Namespace to resolve expressions in. */ ExprList *pList /* The expression list to be analyzed. */ ){ int i; int savedHasAgg = 0; Walker w; if( pList==0 ) return WRC_Continue; w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; w.xSelectCallback2 = 0; w.u.pNC = pNC; savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; if( pExpr==0 ) continue; #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight += pExpr->nHeight; if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ return WRC_Abort; } #endif sqlite3WalkExpr(&w, pExpr); #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight -= pExpr->nHeight; #endif assert( EP_Agg==NC_HasAgg ); assert( EP_Win==NC_HasWin ); testcase( pNC->ncFlags & NC_HasAgg ); testcase( pNC->ncFlags & NC_HasWin ); if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin) ){ ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); savedHasAgg |= pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); } if( pNC->nErr>0 || w.pParse->nErr>0 ) return WRC_Abort; } pNC->ncFlags |= savedHasAgg; return WRC_Continue; } /* ** Resolve all names in all expressions of a SELECT and in all ** decendents of the SELECT, including compounds off of p->pPrior, ** subqueries in expressions, and subqueries used as FROM clause |
98717 98718 98719 98720 98721 98722 98723 | ** have an affinity: ** ** CREATE TABLE t1(a); ** SELECT * FROM t1 WHERE a; ** SELECT a AS b FROM t1 WHERE b; ** SELECT * FROM t1 WHERE (select a from t1); */ | | | | 99461 99462 99463 99464 99465 99466 99467 99468 99469 99470 99471 99472 99473 99474 99475 99476 99477 99478 | ** have an affinity: ** ** CREATE TABLE t1(a); ** SELECT * FROM t1 WHERE a; ** SELECT a AS b FROM t1 WHERE b; ** SELECT * FROM t1 WHERE (select a from t1); */ SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ int op; while( ExprHasProperty(pExpr, EP_Skip) ){ assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; assert( pExpr!=0 ); } op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); |
98787 98788 98789 98790 98791 98792 98793 | } /* ** Skip over any TK_COLLATE operators. */ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ | | | | | | 99531 99532 99533 99534 99535 99536 99537 99538 99539 99540 99541 99542 99543 99544 99545 99546 99547 99548 99549 99550 99551 99552 99553 99554 99555 99556 99557 99558 99559 99560 99561 99562 99563 99564 99565 99566 99567 99568 99569 99570 99571 99572 99573 99574 99575 99576 99577 99578 99579 99580 99581 99582 99583 99584 99585 99586 99587 99588 | } /* ** Skip over any TK_COLLATE operators. */ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; } return pExpr; } /* ** Skip over any TK_COLLATE operators and/or any unlikely() ** or likelihood() or likely() functions at the root of an ** expression. */ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ if( ExprHasProperty(pExpr, EP_Unlikely) ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); assert( pExpr->x.pList->nExpr>0 ); assert( pExpr->op==TK_FUNCTION ); pExpr = pExpr->x.pList->a[0].pExpr; }else{ assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; } } return pExpr; } /* ** Return the collation sequence for the expression pExpr. If ** there is no defined collating sequence, return NULL. ** ** See also: sqlite3ExprNNCollSeq() ** ** The sqlite3ExprNNCollSeq() works the same exact that it returns the ** default collation if pExpr has no defined collation. ** ** The collating sequence might be determined by a COLLATE operator ** or by the presence of a column with a defined collating sequence. ** COLLATE operators take first precedence. Left operands take ** precedence over right operands. */ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ sqlite3 *db = pParse->db; CollSeq *pColl = 0; const Expr *p = pExpr; while( p ){ int op = p->op; if( op==TK_REGISTER ) op = p->op2; if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) && p->y.pTab!=0 ){ /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally |
98899 98900 98901 98902 98903 98904 98905 | ** defautl collation sequence. ** ** See also: sqlite3ExprCollSeq() ** ** The sqlite3ExprCollSeq() routine works the same except that it ** returns NULL if there is no defined collation. */ | | | | | 99643 99644 99645 99646 99647 99648 99649 99650 99651 99652 99653 99654 99655 99656 99657 99658 99659 99660 99661 99662 99663 99664 99665 99666 99667 99668 99669 99670 99671 99672 99673 99674 99675 99676 99677 99678 | ** defautl collation sequence. ** ** See also: sqlite3ExprCollSeq() ** ** The sqlite3ExprCollSeq() routine works the same except that it ** returns NULL if there is no defined collation. */ SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr){ CollSeq *p = sqlite3ExprCollSeq(pParse, pExpr); if( p==0 ) p = pParse->db->pDfltColl; assert( p!=0 ); return p; } /* ** Return TRUE if the two expressions have equivalent collating sequences. */ SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, const Expr *pE1, const Expr *pE2){ CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pE1); CollSeq *pColl2 = sqlite3ExprNNCollSeq(pParse, pE2); return sqlite3StrICmp(pColl1->zName, pColl2->zName)==0; } /* ** pExpr is an operand of a comparison operator. aff2 is the ** type affinity of the other operand. This routine returns the ** type affinity that should be used for the comparison operator. */ SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2){ char aff1 = sqlite3ExprAffinity(pExpr); if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ /* Both sides of the comparison are columns. If one has numeric ** affinity, use that. Otherwise use no affinity. */ if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ return SQLITE_AFF_NUMERIC; |
98942 98943 98944 98945 98946 98947 98948 | } } /* ** pExpr is a comparison operator. Return the type affinity that should ** be applied to both operands prior to doing the comparison. */ | | | 99686 99687 99688 99689 99690 99691 99692 99693 99694 99695 99696 99697 99698 99699 99700 | } } /* ** pExpr is a comparison operator. Return the type affinity that should ** be applied to both operands prior to doing the comparison. */ static char comparisonAffinity(const Expr *pExpr){ char aff; assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); assert( pExpr->pLeft ); aff = sqlite3ExprAffinity(pExpr->pLeft); if( pExpr->pRight ){ |
98965 98966 98967 98968 98969 98970 98971 | /* ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. ** idx_affinity is the affinity of an indexed column. Return true ** if the index with affinity idx_affinity may be used to implement ** the comparison in pExpr. */ | | | > > > > | | | 99709 99710 99711 99712 99713 99714 99715 99716 99717 99718 99719 99720 99721 99722 99723 99724 99725 99726 99727 99728 99729 99730 99731 99732 99733 99734 99735 99736 99737 99738 99739 99740 99741 99742 99743 99744 99745 99746 99747 99748 99749 99750 99751 99752 99753 99754 99755 99756 99757 99758 99759 99760 99761 99762 99763 | /* ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. ** idx_affinity is the affinity of an indexed column. Return true ** if the index with affinity idx_affinity may be used to implement ** the comparison in pExpr. */ SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity){ char aff = comparisonAffinity(pExpr); if( aff<SQLITE_AFF_TEXT ){ return 1; } if( aff==SQLITE_AFF_TEXT ){ return idx_affinity==SQLITE_AFF_TEXT; } return sqlite3IsNumericAffinity(idx_affinity); } /* ** Return the P5 value that should be used for a binary comparison ** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. */ static u8 binaryCompareP5( const Expr *pExpr1, /* Left operand */ const Expr *pExpr2, /* Right operand */ int jumpIfNull /* Extra flags added to P5 */ ){ u8 aff = (char)sqlite3ExprAffinity(pExpr2); aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull; return aff; } /* ** Return a pointer to the collation sequence that should be used by ** a binary comparison operator comparing pLeft and pRight. ** ** If the left hand expression has a collating sequence type, then it is ** used. Otherwise the collation sequence for the right hand expression ** is used, or the default (BINARY) if neither expression has a collating ** type. ** ** Argument pRight (but not pLeft) may be a null pointer. In this case, ** it is not considered. */ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( Parse *pParse, const Expr *pLeft, const Expr *pRight ){ CollSeq *pColl; assert( pLeft ); if( pLeft->flags & EP_Collate ){ pColl = sqlite3ExprCollSeq(pParse, pLeft); }else if( pRight && (pRight->flags & EP_Collate)!=0 ){ pColl = sqlite3ExprCollSeq(pParse, pRight); |
99026 99027 99028 99029 99030 99031 99032 | ** appropriate for the comparison operator. ** ** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). ** However, if the OP_Commuted flag is set, then the order of the operands ** is reversed in the sqlite3BinaryCompareCollSeq() call so that the ** correct collating sequence is found. */ | | | 99774 99775 99776 99777 99778 99779 99780 99781 99782 99783 99784 99785 99786 99787 99788 | ** appropriate for the comparison operator. ** ** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). ** However, if the OP_Commuted flag is set, then the order of the operands ** is reversed in the sqlite3BinaryCompareCollSeq() call so that the ** correct collating sequence is found. */ SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse *pParse, const Expr *p){ if( ExprHasProperty(p, EP_Commuted) ){ return sqlite3BinaryCompareCollSeq(pParse, p->pRight, p->pLeft); }else{ return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); } } |
99269 99270 99271 99272 99273 99274 99275 99276 99277 99278 99279 99280 99281 99282 | int i; int regLeft = 0; int regRight = 0; u8 opx = op; int addrDone = sqlite3VdbeMakeLabel(pParse); int isCommuted = ExprHasProperty(pExpr,EP_Commuted); if( pParse->nErr ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; } assert( pExpr->op==TK_EQ || pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT | > | 100017 100018 100019 100020 100021 100022 100023 100024 100025 100026 100027 100028 100029 100030 100031 | int i; int regLeft = 0; int regRight = 0; u8 opx = op; int addrDone = sqlite3VdbeMakeLabel(pParse); int isCommuted = ExprHasProperty(pExpr,EP_Commuted); assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); if( pParse->nErr ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; } assert( pExpr->op==TK_EQ || pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT |
99881 99882 99883 99884 99885 99886 99887 | #endif ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); assert( !ExprHasProperty(p, EP_FromJoin) ); assert( !ExprHasProperty(p, EP_MemToken) ); | | | 100630 100631 100632 100633 100634 100635 100636 100637 100638 100639 100640 100641 100642 100643 100644 | #endif ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); assert( !ExprHasProperty(p, EP_FromJoin) ); assert( !ExprHasProperty(p, EP_MemToken) ); assert( !ExprHasVVAProperty(p, EP_NoReduce) ); if( p->pLeft || p->x.pList ){ nSize = EXPR_REDUCEDSIZE | EP_Reduced; }else{ assert( p->pRight==0 ); nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; } } |
99986 99987 99988 99989 99990 99991 99992 99993 99994 99995 99996 99997 99998 99999 | } } /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); pNew->flags |= staticFlag; /* Copy the p->u.zToken string, if any. */ if( nToken ){ char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; memcpy(zToken, p->u.zToken, nToken); } | > > > > | 100735 100736 100737 100738 100739 100740 100741 100742 100743 100744 100745 100746 100747 100748 100749 100750 100751 100752 | } } /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); pNew->flags |= staticFlag; ExprClearVVAProperties(pNew); if( dupFlags ){ ExprSetVVAProperty(pNew, EP_Immutable); } /* Copy the p->u.zToken string, if any. */ if( nToken ){ char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; memcpy(zToken, p->u.zToken, nToken); } |
100453 100454 100455 100456 100457 100458 100459 100460 100461 100462 100463 100464 100465 100466 | SQLITE_PRIVATE void sqlite3ExprListSetName( Parse *pParse, /* Parsing context */ ExprList *pList, /* List to which to add the span. */ Token *pName, /* Name to be added */ int dequote /* True to cause the name to be dequoted */ ){ assert( pList!=0 || pParse->db->mallocFailed!=0 ); if( pList ){ struct ExprList_item *pItem; assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; assert( pItem->zEName==0 ); assert( pItem->eEName==ENAME_NAME ); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); | > > > > > | | | > | 101206 101207 101208 101209 101210 101211 101212 101213 101214 101215 101216 101217 101218 101219 101220 101221 101222 101223 101224 101225 101226 101227 101228 101229 101230 101231 101232 101233 101234 101235 | SQLITE_PRIVATE void sqlite3ExprListSetName( Parse *pParse, /* Parsing context */ ExprList *pList, /* List to which to add the span. */ Token *pName, /* Name to be added */ int dequote /* True to cause the name to be dequoted */ ){ assert( pList!=0 || pParse->db->mallocFailed!=0 ); assert( pParse->eParseMode!=PARSE_MODE_UNMAP || dequote==0 ); if( pList ){ struct ExprList_item *pItem; assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; assert( pItem->zEName==0 ); assert( pItem->eEName==ENAME_NAME ); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); if( dequote ){ /* If dequote==0, then pName->z does not point to part of a DDL ** statement handled by the parser. And so no token need be added ** to the token-map. */ sqlite3Dequote(pItem->zEName); if( IN_RENAME_OBJECT ){ sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName); } } } } /* ** Set the ExprList.a[].zSpan element of the most recently added item ** on the expression list. |
100762 100763 100764 100765 100766 100767 100768 | ** (2) the expression does originate in the ON or USING clause ** of a LEFT JOIN, and ** (3) the expression does not contain any EP_FixedCol TK_COLUMN ** operands created by the constant propagation optimization. ** ** When this routine returns true, it indicates that the expression ** can be added to the pParse->pConstExpr list and evaluated once when | | | 101521 101522 101523 101524 101525 101526 101527 101528 101529 101530 101531 101532 101533 101534 101535 | ** (2) the expression does originate in the ON or USING clause ** of a LEFT JOIN, and ** (3) the expression does not contain any EP_FixedCol TK_COLUMN ** operands created by the constant propagation optimization. ** ** When this routine returns true, it indicates that the expression ** can be added to the pParse->pConstExpr list and evaluated once when ** the prepared statement starts up. See sqlite3ExprCodeRunJustOnce(). */ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ return exprIsConst(p, 2, 0); } /* ** Walk an expression tree. Return non-zero if the expression is constant |
101607 101608 101609 101610 101611 101612 101613 101614 101615 101616 101617 101618 101619 101620 | int i; ExprList *pList = pExpr->x.pList; struct ExprList_item *pItem; int r1, r2; affinity = sqlite3ExprAffinity(pLeft); if( affinity<=SQLITE_AFF_NONE ){ affinity = SQLITE_AFF_BLOB; } if( pKeyInfo ){ assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); } /* Loop through each expression in <exprlist>. */ | > > | 102366 102367 102368 102369 102370 102371 102372 102373 102374 102375 102376 102377 102378 102379 102380 102381 | int i; ExprList *pList = pExpr->x.pList; struct ExprList_item *pItem; int r1, r2; affinity = sqlite3ExprAffinity(pLeft); if( affinity<=SQLITE_AFF_NONE ){ affinity = SQLITE_AFF_BLOB; }else if( affinity==SQLITE_AFF_REAL ){ affinity = SQLITE_AFF_NUMERIC; } if( pKeyInfo ){ assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); } /* Loop through each expression in <exprlist>. */ |
101847 101848 101849 101850 101851 101852 101853 101854 101855 101856 101857 101858 101859 101860 | int destStep6 = 0; /* Start of code for Step 6 */ int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ int iTab = 0; /* Index to use */ u8 okConstFactor = pParse->okConstFactor; pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; zAff = exprINAffinity(pParse, pExpr); nVector = sqlite3ExprVectorSize(pExpr->pLeft); aiMap = (int*)sqlite3DbMallocZero( pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 ); | > | 102608 102609 102610 102611 102612 102613 102614 102615 102616 102617 102618 102619 102620 102621 102622 | int destStep6 = 0; /* Start of code for Step 6 */ int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ int iTab = 0; /* Index to use */ u8 okConstFactor = pParse->okConstFactor; assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; zAff = exprINAffinity(pParse, pExpr); nVector = sqlite3ExprVectorSize(pExpr->pLeft); aiMap = (int*)sqlite3DbMallocZero( pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 ); |
101922 101923 101924 101925 101926 101927 101928 | if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; | < < < < < < < | < | 102684 102685 102686 102687 102688 102689 102690 102691 102692 102693 102694 102695 102696 102697 102698 102699 102700 102701 102702 102703 102704 | if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); } for(ii=0; ii<pList->nExpr; ii++){ r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } sqlite3ReleaseTempReg(pParse, regToFree); if( ii<pList->nExpr-1 || destIfNull!=destIfFalse ){ int op = rLhs!=r2 ? OP_Eq : OP_NotNull; sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, |
102319 102320 102321 102322 102323 102324 102325 102326 102327 102328 102329 102330 102331 102332 | for(i=0; i<nResult; i++){ sqlite3ExprCodeFactorable(pParse, p->x.pList->a[i].pExpr, i+iResult); } } } return iResult; } /* ** Generate code to implement special SQL functions that are implemented ** in-line rather than by using the usual callbacks. */ static int exprCodeInlineFunction( Parse *pParse, /* Parsing context */ | > > > > > > > > > > | 103073 103074 103075 103076 103077 103078 103079 103080 103081 103082 103083 103084 103085 103086 103087 103088 103089 103090 103091 103092 103093 103094 103095 103096 | for(i=0; i<nResult; i++){ sqlite3ExprCodeFactorable(pParse, p->x.pList->a[i].pExpr, i+iResult); } } } return iResult; } /* ** If the last opcode is a OP_Copy, then set the do-not-merge flag (p5) ** so that a subsequent copy will not be merged into this one. */ static void setDoNotMergeFlagOnCopy(Vdbe *v){ if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){ sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ } } /* ** Generate code to implement special SQL functions that are implemented ** in-line rather than by using the usual callbacks. */ static int exprCodeInlineFunction( Parse *pParse, /* Parsing context */ |
102351 102352 102353 102354 102355 102356 102357 | assert( nFarg>=2 ); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; i<nFarg; i++){ sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce); VdbeCoverage(v); sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target); } | | < < > > > > > > > | 103115 103116 103117 103118 103119 103120 103121 103122 103123 103124 103125 103126 103127 103128 103129 103130 103131 103132 103133 103134 103135 103136 103137 103138 103139 | assert( nFarg>=2 ); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; i<nFarg; i++){ sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce); VdbeCoverage(v); sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target); } setDoNotMergeFlagOnCopy(v); sqlite3VdbeResolveLabel(v, endCoalesce); break; } case INLINEFUNC_iif: { Expr caseExpr; memset(&caseExpr, 0, sizeof(caseExpr)); caseExpr.op = TK_CASE; caseExpr.x.pList = pFarg; return sqlite3ExprCodeTarget(pParse, &caseExpr, target); } default: { /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. */ assert( nFarg==1 || nFarg==2 ); target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); |
102455 102456 102457 102458 102459 102460 102461 102462 102463 102464 102465 102466 102467 102468 102469 102470 102471 102472 102473 102474 102475 102476 102477 102478 102479 102480 | return 0; } expr_code_doover: if( pExpr==0 ){ op = TK_NULL; }else{ op = pExpr->op; } switch( op ){ case TK_AGG_COLUMN: { AggInfo *pAggInfo = pExpr->pAggInfo; struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; if( !pAggInfo->directMode ){ assert( pCol->iMem>0 ); return pCol->iMem; }else if( pAggInfo->useSortingIdx ){ sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, pCol->iSorterColumn, target); return target; } /* Otherwise, fall thru into the TK_COLUMN case */ } case TK_COLUMN: { int iTab = pExpr->iTable; int iReg; | > > > > > > > > > > | 103224 103225 103226 103227 103228 103229 103230 103231 103232 103233 103234 103235 103236 103237 103238 103239 103240 103241 103242 103243 103244 103245 103246 103247 103248 103249 103250 103251 103252 103253 103254 103255 103256 103257 103258 103259 | return 0; } expr_code_doover: if( pExpr==0 ){ op = TK_NULL; }else{ assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); op = pExpr->op; } switch( op ){ case TK_AGG_COLUMN: { AggInfo *pAggInfo = pExpr->pAggInfo; struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; if( !pAggInfo->directMode ){ assert( pCol->iMem>0 ); return pCol->iMem; }else if( pAggInfo->useSortingIdx ){ Table *pTab = pCol->pTab; sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, pCol->iSorterColumn, target); if( pCol->iColumn<0 ){ VdbeComment((v,"%s.rowid",pTab->zName)); }else{ VdbeComment((v,"%s.%s",pTab->zName,pTab->aCol[pCol->iColumn].zName)); if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } } return target; } /* Otherwise, fall thru into the TK_COLUMN case */ } case TK_COLUMN: { int iTab = pExpr->iTable; int iReg; |
102492 102493 102494 102495 102496 102497 102498 | }else{ aff = pExpr->affExpr; } if( aff>SQLITE_AFF_BLOB ){ static const char zAff[] = "B\000C\000D\000E"; assert( SQLITE_AFF_BLOB=='A' ); assert( SQLITE_AFF_TEXT=='B' ); | < < < < | 103271 103272 103273 103274 103275 103276 103277 103278 103279 103280 103281 103282 103283 103284 | }else{ aff = pExpr->affExpr; } if( aff>SQLITE_AFF_BLOB ){ static const char zAff[] = "B\000C\000D\000E"; assert( SQLITE_AFF_BLOB=='A' ); assert( SQLITE_AFF_TEXT=='B' ); sqlite3VdbeAddOp4(v, OP_Affinity, iReg, 1, 0, &zAff[(aff-'B')*2], P4_STATIC); } return iReg; } if( iTab<0 ){ if( pParse->iSelfTab<0 ){ |
102709 102710 102711 102712 102713 102714 102715 102716 102717 102718 102719 102720 102721 102722 | codeReal(v, pLeft->u.zToken, 1, target); return target; #endif }else{ tempX.op = TK_INTEGER; tempX.flags = EP_IntValue|EP_TokenOnly; tempX.u.iValue = 0; r1 = sqlite3ExprCodeTemp(pParse, &tempX, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); testcase( regFree2==0 ); } break; } | > | 103484 103485 103486 103487 103488 103489 103490 103491 103492 103493 103494 103495 103496 103497 103498 | codeReal(v, pLeft->u.zToken, 1, target); return target; #endif }else{ tempX.op = TK_INTEGER; tempX.flags = EP_IntValue|EP_TokenOnly; tempX.u.iValue = 0; ExprClearVVAProperties(&tempX); r1 = sqlite3ExprCodeTemp(pParse, &tempX, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); testcase( regFree2==0 ); } break; } |
102780 102781 102782 102783 102784 102785 102786 | #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ return pExpr->y.pWin->regResult; } #endif if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ | | | | | < < | < | 103556 103557 103558 103559 103560 103561 103562 103563 103564 103565 103566 103567 103568 103569 103570 103571 103572 103573 103574 103575 103576 | #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ return pExpr->y.pWin->regResult; } #endif if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ /* SQL functions can be expensive. So try to avoid running them ** multiple times if we know they always give the same result */ return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); } assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); assert( !ExprHasProperty(pExpr, EP_TokenOnly) ); pFarg = pExpr->x.pList; nFarg = pFarg ? pFarg->nExpr : 0; assert( !ExprHasProperty(pExpr, EP_IntValue) ); zId = pExpr->u.zToken; pDef = sqlite3FindFunction(db, zId, nFarg, enc, 0); #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION if( pDef==0 && pParse->explain ){ pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); |
103124 103125 103126 103127 103128 103129 103130 103131 103132 103133 103134 103135 103136 103137 103138 103139 103140 | } if( (nExpr&1)!=0 ){ sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); } sqlite3ExprDelete(db, pDel); sqlite3VdbeResolveLabel(v, endLabel); break; } #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { assert( pExpr->affExpr==OE_Rollback || pExpr->affExpr==OE_Abort || pExpr->affExpr==OE_Fail || pExpr->affExpr==OE_Ignore ); | > | | > | | > > > > > > | | > > | > > > > > > > > > > > > > > | | | | | | | | > | 103897 103898 103899 103900 103901 103902 103903 103904 103905 103906 103907 103908 103909 103910 103911 103912 103913 103914 103915 103916 103917 103918 103919 103920 103921 103922 103923 103924 103925 103926 103927 103928 103929 103930 103931 103932 103933 103934 103935 103936 103937 103938 103939 103940 103941 103942 103943 103944 103945 103946 103947 103948 103949 103950 103951 103952 103953 103954 103955 103956 103957 103958 103959 103960 103961 103962 103963 103964 103965 103966 103967 103968 103969 103970 103971 103972 103973 103974 103975 103976 103977 103978 103979 103980 103981 103982 103983 103984 103985 103986 103987 103988 103989 103990 103991 103992 103993 103994 103995 103996 103997 103998 103999 104000 104001 104002 104003 104004 104005 104006 104007 | } if( (nExpr&1)!=0 ){ sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); } sqlite3ExprDelete(db, pDel); setDoNotMergeFlagOnCopy(v); sqlite3VdbeResolveLabel(v, endLabel); break; } #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { assert( pExpr->affExpr==OE_Rollback || pExpr->affExpr==OE_Abort || pExpr->affExpr==OE_Fail || pExpr->affExpr==OE_Ignore ); if( !pParse->pTriggerTab && !pParse->nested ){ sqlite3ErrorMsg(pParse, "RAISE() may only be used within a trigger-program"); return 0; } if( pExpr->affExpr==OE_Abort ){ sqlite3MayAbort(pParse); } assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->affExpr==OE_Ignore ){ sqlite3VdbeAddOp4( v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); VdbeCoverage(v); }else{ sqlite3HaltConstraint(pParse, pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, pExpr->affExpr, pExpr->u.zToken, 0, 0); } break; } #endif } sqlite3ReleaseTempReg(pParse, regFree1); sqlite3ReleaseTempReg(pParse, regFree2); return inReg; } /* ** Generate code that will evaluate expression pExpr just one time ** per prepared statement execution. ** ** If the expression uses functions (that might throw an exception) then ** guard them with an OP_Once opcode to ensure that the code is only executed ** once. If no functions are involved, then factor the code out and put it at ** the end of the prepared statement in the initialization section. ** ** If regDest>=0 then the result is always stored in that register and the ** result is not reusable. If regDest<0 then this routine is free to ** store the value whereever it wants. The register where the expression ** is stored is returned. When regDest<0, two identical expressions might ** code to the same register, if they do not contain function calls and hence ** are factored out into the initialization section at the end of the ** prepared statement. */ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The expression to code when the VDBE initializes */ int regDest /* Store the value in this register */ ){ ExprList *p; assert( ConstFactorOk(pParse) ); p = pParse->pConstExpr; if( regDest<0 && p ){ struct ExprList_item *pItem; int i; for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ return pItem->u.iConstExprReg; } } } pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); if( pExpr!=0 && ExprHasProperty(pExpr, EP_HasFunc) ){ Vdbe *v = pParse->pVdbe; int addr; assert( v ); addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); pParse->okConstFactor = 0; if( !pParse->db->mallocFailed ){ if( regDest<0 ) regDest = ++pParse->nMem; sqlite3ExprCode(pParse, pExpr, regDest); } pParse->okConstFactor = 1; sqlite3ExprDelete(pParse->db, pExpr); sqlite3VdbeJumpHere(v, addr); }else{ p = sqlite3ExprListAppend(pParse, p, pExpr); if( p ){ struct ExprList_item *pItem = &p->a[p->nExpr-1]; pItem->reusable = regDest<0; if( regDest<0 ) regDest = ++pParse->nMem; pItem->u.iConstExprReg = regDest; } pParse->pConstExpr = p; } return regDest; } /* ** Generate code to evaluate an expression and store the results ** into a register. Return the register number where the results ** are stored. |
103220 103221 103222 103223 103224 103225 103226 | int r2; pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); if( ConstFactorOk(pParse) && pExpr->op!=TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr) ){ *pReg = 0; | | | 104018 104019 104020 104021 104022 104023 104024 104025 104026 104027 104028 104029 104030 104031 104032 | int r2; pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); if( ConstFactorOk(pParse) && pExpr->op!=TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr) ){ *pReg = 0; r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); }else{ int r1 = sqlite3GetTempReg(pParse); r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); if( r2==r1 ){ *pReg = r1; }else{ sqlite3ReleaseTempReg(pParse, r1); |
103242 103243 103244 103245 103246 103247 103248 103249 103250 103251 103252 103253 103254 103255 | ** Generate code that will evaluate expression pExpr and store the ** results in register target. The results are guaranteed to appear ** in register target. */ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ int inReg; assert( target>0 && target<=pParse->nMem ); inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); if( inReg!=target && pParse->pVdbe ){ u8 op; if( ExprHasProperty(pExpr,EP_Subquery) ){ op = OP_Copy; | > | 104040 104041 104042 104043 104044 104045 104046 104047 104048 104049 104050 104051 104052 104053 104054 | ** Generate code that will evaluate expression pExpr and store the ** results in register target. The results are guaranteed to appear ** in register target. */ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ int inReg; assert( pExpr==0 || !ExprHasVVAProperty(pExpr,EP_Immutable) ); assert( target>0 && target<=pParse->nMem ); inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); if( inReg!=target && pParse->pVdbe ){ u8 op; if( ExprHasProperty(pExpr,EP_Subquery) ){ op = OP_Copy; |
103276 103277 103278 103279 103280 103281 103282 | ** Generate code that will evaluate expression pExpr and store the ** results in register target. The results are guaranteed to appear ** in register target. If the expression is constant, then this routine ** might choose to code the expression at initialization time. */ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){ | | | 104075 104076 104077 104078 104079 104080 104081 104082 104083 104084 104085 104086 104087 104088 104089 | ** Generate code that will evaluate expression pExpr and store the ** results in register target. The results are guaranteed to appear ** in register target. If the expression is constant, then this routine ** might choose to code the expression at initialization time. */ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){ sqlite3ExprCodeRunJustOnce(pParse, pExpr, target); }else{ sqlite3ExprCodeCopy(pParse, pExpr, target); } } /* ** Generate code that pushes the value of every element of the given |
103336 103337 103338 103339 103340 103341 103342 | n--; }else{ sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); } }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstantNotJoin(pExpr) ){ | | | 104135 104136 104137 104138 104139 104140 104141 104142 104143 104144 104145 104146 104147 104148 104149 | n--; }else{ sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); } }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstantNotJoin(pExpr) ){ sqlite3ExprCodeRunJustOnce(pParse, pExpr, target+i); }else{ int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); if( inReg!=target+i ){ VdbeOp *pOp; if( copyOp==OP_Copy && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy && pOp->p1+pOp->p3+1==inReg |
103459 103460 103461 103462 103463 103464 103465 103466 103467 103468 103469 103470 103471 103472 | int regFree1 = 0; int regFree2 = 0; int r1, r2; assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ if( NEVER(pExpr==0) ) return; /* No way this can happen */ op = pExpr->op; switch( op ){ case TK_AND: case TK_OR: { Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); if( pAlt!=pExpr ){ sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); | > | 104258 104259 104260 104261 104262 104263 104264 104265 104266 104267 104268 104269 104270 104271 104272 | int regFree1 = 0; int regFree2 = 0; int r1, r2; assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ if( NEVER(pExpr==0) ) return; /* No way this can happen */ assert( !ExprHasVVAProperty(pExpr, EP_Immutable) ); op = pExpr->op; switch( op ){ case TK_AND: case TK_OR: { Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); if( pAlt!=pExpr ){ sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); |
103600 103601 103602 103603 103604 103605 103606 103607 103608 103609 103610 103611 103612 103613 | int regFree1 = 0; int regFree2 = 0; int r1, r2; assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ if( pExpr==0 ) return; /* The value of pExpr->op and op are related as follows: ** ** pExpr->op op ** --------- ---------- ** TK_ISNULL OP_NotNull ** TK_NOTNULL OP_IsNull | > | 104400 104401 104402 104403 104404 104405 104406 104407 104408 104409 104410 104411 104412 104413 104414 | int regFree1 = 0; int regFree2 = 0; int r1, r2; assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ if( pExpr==0 ) return; assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); /* The value of pExpr->op and op are related as follows: ** ** pExpr->op op ** --------- ---------- ** TK_ISNULL OP_NotNull ** TK_NOTNULL OP_IsNull |
103883 103884 103885 103886 103887 103888 103889 | if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } if( (pA->flags & (EP_Distinct|EP_Commuted)) != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; | | | | < < < < < < < < < < < < < < | 104684 104685 104686 104687 104688 104689 104690 104691 104692 104693 104694 104695 104696 104697 104698 104699 104700 104701 104702 104703 104704 104705 104706 104707 104708 104709 | if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } if( (pA->flags & (EP_Distinct|EP_Commuted)) != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE && ALWAYS((combinedFlags & EP_Reduced)==0) ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->op2!=pB->op2 && pA->op==TK_TRUTH ) return 2; if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ return 2; } } } return 0; } |
104146 104147 104148 104149 104150 104151 104152 | ** a term of the form x=y does not prove that y is not null if x ** is the column of a virtual table */ case TK_EQ: case TK_NE: case TK_LT: case TK_LE: case TK_GT: | | > > > > | > | > | | | 104933 104934 104935 104936 104937 104938 104939 104940 104941 104942 104943 104944 104945 104946 104947 104948 104949 104950 104951 104952 104953 104954 104955 104956 104957 104958 104959 104960 104961 104962 104963 104964 104965 | ** a term of the form x=y does not prove that y is not null if x ** is the column of a virtual table */ case TK_EQ: case TK_NE: case TK_LT: case TK_LE: case TK_GT: case TK_GE: { Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; testcase( pExpr->op==TK_EQ ); testcase( pExpr->op==TK_NE ); testcase( pExpr->op==TK_LT ); testcase( pExpr->op==TK_LE ); testcase( pExpr->op==TK_GT ); testcase( pExpr->op==TK_GE ); /* The y.pTab=0 assignment in wherecode.c always happens after the ** impliesNotNullRow() test */ if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) && IsVirtual(pLeft->y.pTab)) || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) && IsVirtual(pRight->y.pTab)) ){ return WRC_Prune; } } default: return WRC_Continue; } } /* ** Return true (non-zero) if expression p can only be true if at least |
104755 104756 104757 104758 104759 104760 104761 | /* Get a NULL terminated version of the new table name. */ zName = sqlite3NameFromToken(db, pName); if( !zName ) goto exit_rename_table; /* Check that a table or index named 'zName' does not already exist ** in database iDb. If so, this is an error. */ | | > > > | 105548 105549 105550 105551 105552 105553 105554 105555 105556 105557 105558 105559 105560 105561 105562 105563 105564 105565 | /* Get a NULL terminated version of the new table name. */ zName = sqlite3NameFromToken(db, pName); if( !zName ) goto exit_rename_table; /* Check that a table or index named 'zName' does not already exist ** in database iDb. If so, this is an error. */ if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) || sqlite3IsShadowTableOf(db, pTab, zName) ){ sqlite3ErrorMsg(pParse, "there is already another table or index with this name: %s", zName); goto exit_rename_table; } /* Make sure it is not a system table being altered, or a reserved name ** that the table is being renamed to. |
104886 104887 104888 104889 104890 104891 104892 104893 104894 104895 104896 104897 104898 104899 | renameTestSchema(pParse, zDb, iDb==1); exit_rename_table: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); db->mDbFlags = savedDbFlags; } /* ** This function is called after an "ALTER TABLE ... ADD" statement ** has been parsed. Argument pColDef contains the text of the new ** column definition. ** ** The Table structure pParse->pNewTable was extended to include | > > > > > > > > > > > > > > > > | 105682 105683 105684 105685 105686 105687 105688 105689 105690 105691 105692 105693 105694 105695 105696 105697 105698 105699 105700 105701 105702 105703 105704 105705 105706 105707 105708 105709 105710 105711 | renameTestSchema(pParse, zDb, iDb==1); exit_rename_table: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); db->mDbFlags = savedDbFlags; } /* ** Write code that will raise an error if the table described by ** zDb and zTab is not empty. */ static void sqlite3ErrorIfNotEmpty( Parse *pParse, /* Parsing context */ const char *zDb, /* Schema holding the table */ const char *zTab, /* Table to check for empty */ const char *zErr /* Error message text */ ){ sqlite3NestedParse(pParse, "SELECT raise(ABORT,%Q) FROM \"%w\".\"%w\"", zErr, zDb, zTab ); } /* ** This function is called after an "ALTER TABLE ... ADD" statement ** has been parsed. Argument pColDef contains the text of the new ** column definition. ** ** The Table structure pParse->pNewTable was extended to include |
104939 104940 104941 104942 104943 104944 104945 | ** column must not be NULL. */ if( pCol->colFlags & COLFLAG_PRIMKEY ){ sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); return; } if( pNew->pIndex ){ | | > | < | < > > | < | < | 105751 105752 105753 105754 105755 105756 105757 105758 105759 105760 105761 105762 105763 105764 105765 105766 105767 105768 105769 105770 105771 105772 105773 105774 105775 105776 105777 105778 105779 105780 105781 105782 105783 105784 105785 105786 105787 105788 105789 105790 105791 105792 105793 105794 105795 105796 105797 105798 105799 105800 105801 105802 105803 105804 105805 105806 105807 | ** column must not be NULL. */ if( pCol->colFlags & COLFLAG_PRIMKEY ){ sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); return; } if( pNew->pIndex ){ sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); return; } if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ /* If the default value for the new column was specified with a ** literal NULL, then set pDflt to 0. This simplifies checking ** for an SQL NULL default below. */ assert( pDflt==0 || pDflt->op==TK_SPAN ); if( pDflt && pDflt->pLeft->op==TK_NULL ){ pDflt = 0; } if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a REFERENCES column with non-NULL default value"); } if( pCol->notNull && !pDflt ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a NOT NULL column with default value NULL"); } /* Ensure the default expression is something that sqlite3ValueFromExpr() ** can handle (i.e. not CURRENT_TIME etc.) */ if( pDflt ){ sqlite3_value *pVal = 0; int rc; rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); if( rc!=SQLITE_OK ){ assert( db->mallocFailed == 1 ); return; } if( !pVal ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a column with non-constant default"); } sqlite3ValueFree(pVal); } }else if( pCol->colFlags & COLFLAG_STORED ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "cannot add a STORED column"); } /* Modify the CREATE TABLE statement. */ zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); if( zCol ){ char *zEnd = &zCol[pColDef->n-1]; |
105101 105102 105103 105104 105105 105106 105107 105108 105109 105110 105111 105112 105113 105114 | assert( db->mallocFailed ); goto exit_begin_add_column; } memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); for(i=0; i<pNew->nCol; i++){ Column *pCol = &pNew->aCol[i]; pCol->zName = sqlite3DbStrDup(db, pCol->zName); pCol->zColl = 0; pCol->pDflt = 0; } pNew->pSchema = db->aDb[iDb].pSchema; pNew->addColOffset = pTab->addColOffset; pNew->nTabRef = 1; | > | 105912 105913 105914 105915 105916 105917 105918 105919 105920 105921 105922 105923 105924 105925 105926 | assert( db->mallocFailed ); goto exit_begin_add_column; } memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); for(i=0; i<pNew->nCol; i++){ Column *pCol = &pNew->aCol[i]; pCol->zName = sqlite3DbStrDup(db, pCol->zName); pCol->hName = sqlite3StrIHash(pCol->zName); pCol->zColl = 0; pCol->pDflt = 0; } pNew->pSchema = db->aDb[iDb].pSchema; pNew->addColOffset = pTab->addColOffset; pNew->nTabRef = 1; |
105329 105330 105331 105332 105333 105334 105335 | ** with tail recursion in tokenExpr() routine, for a small performance ** improvement. */ SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ RenameToken *pNew; assert( pPtr || pParse->db->mallocFailed ); renameTokenCheckAll(pParse, pPtr); | | | 106141 106142 106143 106144 106145 106146 106147 106148 106149 106150 106151 106152 106153 106154 106155 | ** with tail recursion in tokenExpr() routine, for a small performance ** improvement. */ SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ RenameToken *pNew; assert( pPtr || pParse->db->mallocFailed ); renameTokenCheckAll(pParse, pPtr); if( ALWAYS(pParse->eParseMode!=PARSE_MODE_UNMAP) ){ pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); if( pNew ){ pNew->p = pPtr; pNew->t = *pToken; pNew->pNext = pParse->pRename; pParse->pRename = pNew; } |
106544 106545 106546 106547 106548 106549 106550 106551 106552 106553 106554 106555 106556 106557 106558 106559 106560 106561 106562 106563 | }; int i; sqlite3 *db = pParse->db; Db *pDb; Vdbe *v = sqlite3GetVdbe(pParse); int aRoot[ArraySize(aTable)]; u8 aCreateTbl[ArraySize(aTable)]; if( v==0 ) return; assert( sqlite3BtreeHoldsAllMutexes(db) ); assert( sqlite3VdbeDb(v)==db ); pDb = &db->aDb[iDb]; /* Create new statistic tables if they do not exist, or clear them ** if they do already exist. */ for(i=0; i<ArraySize(aTable); i++){ const char *zTab = aTable[i].zName; Table *pStat; if( (pStat = sqlite3FindTable(db, zTab, pDb->zDbSName))==0 ){ | > > > > > > | < | | | | | > > | | > > > > < | | | | | | | | | | | > | | | | > | | > < < | | | | | > | | | | > | | | > < > > > < > > < | | | | | | 107356 107357 107358 107359 107360 107361 107362 107363 107364 107365 107366 107367 107368 107369 107370 107371 107372 107373 107374 107375 107376 107377 107378 107379 107380 107381 107382 107383 107384 107385 107386 107387 107388 107389 107390 107391 107392 107393 107394 107395 107396 107397 107398 107399 107400 107401 107402 107403 107404 107405 107406 107407 107408 107409 107410 107411 107412 107413 107414 107415 107416 107417 107418 107419 107420 107421 107422 107423 107424 107425 107426 107427 107428 107429 107430 107431 107432 107433 107434 107435 107436 107437 107438 107439 107440 107441 107442 107443 107444 107445 107446 107447 107448 107449 107450 107451 107452 107453 107454 107455 107456 107457 107458 107459 107460 107461 107462 107463 107464 107465 107466 107467 107468 107469 107470 107471 107472 107473 107474 107475 107476 107477 107478 107479 107480 107481 107482 107483 107484 107485 107486 107487 107488 107489 107490 107491 107492 107493 107494 107495 107496 107497 107498 107499 107500 107501 107502 107503 107504 107505 107506 107507 107508 107509 107510 107511 107512 107513 107514 107515 107516 107517 107518 107519 107520 107521 107522 107523 107524 107525 107526 107527 107528 107529 107530 107531 107532 107533 107534 107535 107536 107537 107538 107539 107540 107541 107542 107543 107544 107545 107546 107547 107548 107549 107550 107551 107552 107553 107554 107555 107556 107557 107558 107559 107560 107561 107562 107563 107564 107565 107566 107567 107568 107569 107570 107571 107572 107573 107574 107575 107576 107577 107578 107579 107580 107581 107582 107583 107584 107585 107586 107587 107588 107589 107590 107591 107592 107593 107594 107595 107596 107597 107598 107599 107600 107601 107602 107603 107604 107605 107606 107607 107608 107609 107610 107611 107612 107613 107614 107615 107616 107617 107618 107619 107620 107621 107622 107623 107624 107625 107626 107627 107628 107629 107630 107631 107632 107633 107634 107635 107636 107637 107638 107639 107640 107641 107642 107643 107644 107645 107646 107647 107648 107649 107650 107651 107652 107653 107654 107655 107656 107657 107658 107659 107660 107661 107662 107663 107664 107665 107666 107667 | }; int i; sqlite3 *db = pParse->db; Db *pDb; Vdbe *v = sqlite3GetVdbe(pParse); int aRoot[ArraySize(aTable)]; u8 aCreateTbl[ArraySize(aTable)]; #ifdef SQLITE_ENABLE_STAT4 const int nToOpen = OptimizationEnabled(db,SQLITE_Stat4) ? 2 : 1; #else const int nToOpen = 1; #endif if( v==0 ) return; assert( sqlite3BtreeHoldsAllMutexes(db) ); assert( sqlite3VdbeDb(v)==db ); pDb = &db->aDb[iDb]; /* Create new statistic tables if they do not exist, or clear them ** if they do already exist. */ for(i=0; i<ArraySize(aTable); i++){ const char *zTab = aTable[i].zName; Table *pStat; aCreateTbl[i] = 0; if( (pStat = sqlite3FindTable(db, zTab, pDb->zDbSName))==0 ){ if( i<nToOpen ){ /* The sqlite_statN table does not exist. Create it. Note that a ** side-effect of the CREATE TABLE statement is to leave the rootpage ** of the new table in register pParse->regRoot. This is important ** because the OpenWrite opcode below will be needing it. */ sqlite3NestedParse(pParse, "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols ); aRoot[i] = pParse->regRoot; aCreateTbl[i] = OPFLAG_P2ISREG; } }else{ /* The table already exists. If zWhere is not NULL, delete all entries ** associated with the table zWhere. If zWhere is NULL, delete the ** entire contents of the table. */ aRoot[i] = pStat->tnum; sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); if( zWhere ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE %s=%Q", pDb->zDbSName, zTab, zWhereType, zWhere ); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK }else if( db->xPreUpdateCallback ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab); #endif }else{ /* The sqlite_stat[134] table already exists. Delete all rows. */ sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); } } } /* Open the sqlite_stat[134] tables for writing. */ for(i=0; i<nToOpen; i++){ assert( i<ArraySize(aTable) ); sqlite3VdbeAddOp4Int(v, OP_OpenWrite, iStatCur+i, aRoot[i], iDb, 3); sqlite3VdbeChangeP5(v, aCreateTbl[i]); VdbeComment((v, aTable[i].zName)); } } /* ** Recommended number of samples for sqlite_stat4 */ #ifndef SQLITE_STAT4_SAMPLES # define SQLITE_STAT4_SAMPLES 24 #endif /* ** Three SQL functions - stat_init(), stat_push(), and stat_get() - ** share an instance of the following structure to hold their state ** information. */ typedef struct StatAccum StatAccum; typedef struct StatSample StatSample; struct StatSample { tRowcnt *anEq; /* sqlite_stat4.nEq */ tRowcnt *anDLt; /* sqlite_stat4.nDLt */ #ifdef SQLITE_ENABLE_STAT4 tRowcnt *anLt; /* sqlite_stat4.nLt */ union { i64 iRowid; /* Rowid in main table of the key */ u8 *aRowid; /* Key for WITHOUT ROWID tables */ } u; u32 nRowid; /* Sizeof aRowid[] */ u8 isPSample; /* True if a periodic sample */ int iCol; /* If !isPSample, the reason for inclusion */ u32 iHash; /* Tiebreaker hash */ #endif }; struct StatAccum { sqlite3 *db; /* Database connection, for malloc() */ tRowcnt nEst; /* Estimated number of rows */ tRowcnt nRow; /* Number of rows visited so far */ int nLimit; /* Analysis row-scan limit */ int nCol; /* Number of columns in index + pk/rowid */ int nKeyCol; /* Number of index columns w/o the pk/rowid */ u8 nSkipAhead; /* Number of times of skip-ahead */ StatSample current; /* Current row as a StatSample */ #ifdef SQLITE_ENABLE_STAT4 tRowcnt nPSample; /* How often to do a periodic sample */ int mxSample; /* Maximum number of samples to accumulate */ u32 iPrn; /* Pseudo-random number used for sampling */ StatSample *aBest; /* Array of nCol best samples */ int iMin; /* Index in a[] of entry with minimum score */ int nSample; /* Current number of samples */ int nMaxEqZero; /* Max leading 0 in anEq[] for any a[] entry */ int iGet; /* Index of current sample accessed by stat_get() */ StatSample *a; /* Array of mxSample StatSample objects */ #endif }; /* Reclaim memory used by a StatSample */ #ifdef SQLITE_ENABLE_STAT4 static void sampleClear(sqlite3 *db, StatSample *p){ assert( db!=0 ); if( p->nRowid ){ sqlite3DbFree(db, p->u.aRowid); p->nRowid = 0; } } #endif /* Initialize the BLOB value of a ROWID */ #ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowid(sqlite3 *db, StatSample *p, int n, const u8 *pData){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); p->u.aRowid = sqlite3DbMallocRawNN(db, n); if( p->u.aRowid ){ p->nRowid = n; memcpy(p->u.aRowid, pData, n); }else{ p->nRowid = 0; } } #endif /* Initialize the INTEGER value of a ROWID. */ #ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowidInt64(sqlite3 *db, StatSample *p, i64 iRowid){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); p->nRowid = 0; p->u.iRowid = iRowid; } #endif /* ** Copy the contents of object (*pFrom) into (*pTo). */ #ifdef SQLITE_ENABLE_STAT4 static void sampleCopy(StatAccum *p, StatSample *pTo, StatSample *pFrom){ pTo->isPSample = pFrom->isPSample; pTo->iCol = pFrom->iCol; pTo->iHash = pFrom->iHash; memcpy(pTo->anEq, pFrom->anEq, sizeof(tRowcnt)*p->nCol); memcpy(pTo->anLt, pFrom->anLt, sizeof(tRowcnt)*p->nCol); memcpy(pTo->anDLt, pFrom->anDLt, sizeof(tRowcnt)*p->nCol); if( pFrom->nRowid ){ sampleSetRowid(p->db, pTo, pFrom->nRowid, pFrom->u.aRowid); }else{ sampleSetRowidInt64(p->db, pTo, pFrom->u.iRowid); } } #endif /* ** Reclaim all memory of a StatAccum structure. */ static void statAccumDestructor(void *pOld){ StatAccum *p = (StatAccum*)pOld; #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ){ int i; for(i=0; i<p->nCol; i++) sampleClear(p->db, p->aBest+i); for(i=0; i<p->mxSample; i++) sampleClear(p->db, p->a+i); sampleClear(p->db, &p->current); } #endif sqlite3DbFree(p->db, p); } /* ** Implementation of the stat_init(N,K,C,L) SQL function. The four parameters ** are: ** N: The number of columns in the index including the rowid/pk (note 1) ** K: The number of columns in the index excluding the rowid/pk. ** C: Estimated number of rows in the index ** L: A limit on the number of rows to scan, or 0 for no-limit ** ** Note 1: In the special case of the covering index that implements a ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the ** total number of columns in the table. ** ** For indexes on ordinary rowid tables, N==K+1. But for indexes on ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the ** PRIMARY KEY of the table. The covering index that implements the ** original WITHOUT ROWID table as N==K as a special case. ** ** This routine allocates the StatAccum object in heap memory. The return ** value is a pointer to the StatAccum object. The datatype of the ** return value is BLOB, but it is really just a pointer to the StatAccum ** object. */ static void statInit( sqlite3_context *context, int argc, sqlite3_value **argv ){ StatAccum *p; int nCol; /* Number of columns in index being sampled */ int nKeyCol; /* Number of key columns */ int nColUp; /* nCol rounded up for alignment */ int n; /* Bytes of space to allocate */ sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */ #ifdef SQLITE_ENABLE_STAT4 /* Maximum number of samples. 0 if STAT4 data is not collected */ int mxSample = OptimizationEnabled(db,SQLITE_Stat4) ?SQLITE_STAT4_SAMPLES :0; #endif /* Decode the three function arguments */ UNUSED_PARAMETER(argc); nCol = sqlite3_value_int(argv[0]); assert( nCol>0 ); nColUp = sizeof(tRowcnt)<8 ? (nCol+1)&~1 : nCol; nKeyCol = sqlite3_value_int(argv[1]); assert( nKeyCol<=nCol ); assert( nKeyCol>0 ); /* Allocate the space required for the StatAccum object */ n = sizeof(*p) + sizeof(tRowcnt)*nColUp /* StatAccum.anEq */ + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ #ifdef SQLITE_ENABLE_STAT4 if( mxSample ){ n += sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample); } #endif db = sqlite3_context_db_handle(context); p = sqlite3DbMallocZero(db, n); if( p==0 ){ sqlite3_result_error_nomem(context); return; } p->db = db; p->nEst = sqlite3_value_int64(argv[2]); p->nRow = 0; p->nLimit = sqlite3_value_int64(argv[3]); p->nCol = nCol; p->nKeyCol = nKeyCol; p->nSkipAhead = 0; p->current.anDLt = (tRowcnt*)&p[1]; p->current.anEq = &p->current.anDLt[nColUp]; #ifdef SQLITE_ENABLE_STAT4 p->mxSample = p->nLimit==0 ? mxSample : 0; if( mxSample ){ u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ p->iGet = -1; p->nPSample = (tRowcnt)(p->nEst/(mxSample/3+1) + 1); p->current.anLt = &p->current.anEq[nColUp]; p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); /* Set up the StatAccum.a[] and aBest[] arrays */ p->a = (struct StatSample*)&p->current.anLt[nColUp]; p->aBest = &p->a[mxSample]; pSpace = (u8*)(&p->a[mxSample+nCol]); for(i=0; i<(mxSample+nCol); i++){ p->a[i].anEq = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); p->a[i].anLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); p->a[i].anDLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); } assert( (pSpace - (u8*)p)==n ); for(i=0; i<nCol; i++){ p->aBest[i].iCol = i; } } #endif /* Return a pointer to the allocated object to the caller. Note that ** only the pointer (the 2nd parameter) matters. The size of the object ** (given by the 3rd parameter) is never used and can be any positive ** value. */ sqlite3_result_blob(context, p, sizeof(*p), statAccumDestructor); } static const FuncDef statInitFuncdef = { 4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ statInit, /* xSFunc */ 0, /* xFinalize */ 0, 0, /* xValue, xInverse */ "stat_init", /* zName */ |
106849 106850 106851 106852 106853 106854 106855 | ** In other words, if we assume that the cardinalities of the selected ** column for pNew and pOld are equal, is pNew to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of ** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. */ static int sampleIsBetterPost( | | | | | 107677 107678 107679 107680 107681 107682 107683 107684 107685 107686 107687 107688 107689 107690 107691 107692 107693 | ** In other words, if we assume that the cardinalities of the selected ** column for pNew and pOld are equal, is pNew to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of ** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. */ static int sampleIsBetterPost( StatAccum *pAccum, StatSample *pNew, StatSample *pOld ){ int nCol = pAccum->nCol; int i; assert( pNew->iCol==pOld->iCol ); for(i=pNew->iCol+1; i<nCol; i++){ if( pNew->anEq[i]>pOld->anEq[i] ) return 1; if( pNew->anEq[i]<pOld->anEq[i] ) return 0; |
106873 106874 106875 106876 106877 106878 106879 | /* ** Return true if pNew is to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of ** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. */ static int sampleIsBetter( | | | | | | | | | | | | | 107701 107702 107703 107704 107705 107706 107707 107708 107709 107710 107711 107712 107713 107714 107715 107716 107717 107718 107719 107720 107721 107722 107723 107724 107725 107726 107727 107728 107729 107730 107731 107732 107733 107734 107735 107736 107737 107738 107739 107740 107741 107742 107743 107744 107745 107746 107747 107748 107749 107750 107751 107752 107753 107754 107755 107756 107757 107758 107759 107760 107761 107762 107763 107764 107765 107766 107767 107768 107769 107770 107771 107772 107773 107774 107775 107776 107777 107778 107779 | /* ** Return true if pNew is to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of ** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. */ static int sampleIsBetter( StatAccum *pAccum, StatSample *pNew, StatSample *pOld ){ tRowcnt nEqNew = pNew->anEq[pNew->iCol]; tRowcnt nEqOld = pOld->anEq[pOld->iCol]; assert( pOld->isPSample==0 && pNew->isPSample==0 ); assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); if( (nEqNew>nEqOld) ) return 1; if( nEqNew==nEqOld ){ if( pNew->iCol<pOld->iCol ) return 1; return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); } return 0; } /* ** Copy the contents of sample *pNew into the p->a[] array. If necessary, ** remove the least desirable sample from p->a[] to make room. */ static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ StatSample *pSample = 0; int i; assert( IsStat4 || nEqZero==0 ); /* StatAccum.nMaxEqZero is set to the maximum number of leading 0 ** values in the anEq[] array of any sample in StatAccum.a[]. In ** other words, if nMaxEqZero is n, then it is guaranteed that there ** are no samples with StatSample.anEq[m]==0 for (m>=n). */ if( nEqZero>p->nMaxEqZero ){ p->nMaxEqZero = nEqZero; } if( pNew->isPSample==0 ){ StatSample *pUpgrade = 0; assert( pNew->anEq[pNew->iCol]>0 ); /* This sample is being added because the prefix that ends in column ** iCol occurs many times in the table. However, if we have already ** added a sample that shares this prefix, there is no need to add ** this one. Instead, upgrade the priority of the highest priority ** existing sample that shares this prefix. */ for(i=p->nSample-1; i>=0; i--){ StatSample *pOld = &p->a[i]; if( pOld->anEq[pNew->iCol]==0 ){ if( pOld->isPSample ) return; assert( pOld->iCol>pNew->iCol ); assert( sampleIsBetter(p, pNew, pOld) ); if( pUpgrade==0 || sampleIsBetter(p, pOld, pUpgrade) ){ pUpgrade = pOld; } } } if( pUpgrade ){ pUpgrade->iCol = pNew->iCol; pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; goto find_new_min; } } /* If necessary, remove sample iMin to make room for the new sample. */ if( p->nSample>=p->mxSample ){ StatSample *pMin = &p->a[p->iMin]; tRowcnt *anEq = pMin->anEq; tRowcnt *anLt = pMin->anLt; tRowcnt *anDLt = pMin->anDLt; sampleClear(p->db, pMin); memmove(pMin, &pMin[1], sizeof(p->a[0])*(p->nSample-p->iMin-1)); pSample = &p->a[p->nSample-1]; pSample->nRowid = 0; |
106980 106981 106982 106983 106984 106985 106986 106987 106988 106989 106990 106991 106992 | } assert( iMin>=0 ); p->iMin = iMin; } } #endif /* SQLITE_ENABLE_STAT4 */ /* ** Field iChng of the index being scanned has changed. So at this point ** p->current contains a sample that reflects the previous row of the ** index. The value of anEq[iChng] and subsequent anEq[] elements are ** correct at this point. */ | > | < | | 107808 107809 107810 107811 107812 107813 107814 107815 107816 107817 107818 107819 107820 107821 107822 107823 107824 107825 107826 107827 107828 107829 107830 107831 107832 107833 107834 107835 | } assert( iMin>=0 ); p->iMin = iMin; } } #endif /* SQLITE_ENABLE_STAT4 */ #ifdef SQLITE_ENABLE_STAT4 /* ** Field iChng of the index being scanned has changed. So at this point ** p->current contains a sample that reflects the previous row of the ** index. The value of anEq[iChng] and subsequent anEq[] elements are ** correct at this point. */ static void samplePushPrevious(StatAccum *p, int iChng){ int i; /* Check if any samples from the aBest[] array should be pushed ** into IndexSample.a[] at this point. */ for(i=(p->nCol-2); i>=iChng; i--){ StatSample *pBest = &p->aBest[i]; pBest->anEq[i] = p->current.anEq[i]; if( p->nSample<p->mxSample || sampleIsBetter(p, pBest, &p->a[p->iMin]) ){ sampleInsert(p, pBest, i); } } /* Check that no sample contains an anEq[] entry with an index of |
107017 107018 107019 107020 107021 107022 107023 | int j; for(j=iChng; j<p->nCol; j++){ if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; } } p->nMaxEqZero = iChng; } | < | | < < < < | < | > | | > > > | > | > | > > > | | | | | | | < < < | < | > > > | > > | 107845 107846 107847 107848 107849 107850 107851 107852 107853 107854 107855 107856 107857 107858 107859 107860 107861 107862 107863 107864 107865 107866 107867 107868 107869 107870 107871 107872 107873 107874 107875 107876 107877 107878 107879 107880 107881 107882 107883 107884 107885 107886 107887 107888 107889 107890 107891 107892 107893 107894 107895 107896 107897 107898 107899 107900 107901 107902 107903 107904 107905 107906 107907 107908 107909 107910 107911 107912 107913 107914 107915 107916 107917 107918 107919 107920 107921 107922 107923 107924 107925 107926 107927 107928 107929 107930 107931 107932 107933 107934 107935 107936 107937 107938 107939 107940 107941 107942 107943 107944 107945 107946 107947 107948 107949 107950 107951 107952 107953 107954 107955 | int j; for(j=iChng; j<p->nCol; j++){ if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; } } p->nMaxEqZero = iChng; } } #endif /* SQLITE_ENABLE_STAT4 */ /* ** Implementation of the stat_push SQL function: stat_push(P,C,R) ** Arguments: ** ** P Pointer to the StatAccum object created by stat_init() ** C Index of left-most column to differ from previous row ** R Rowid for the current row. Might be a key record for ** WITHOUT ROWID tables. ** ** The purpose of this routine is to collect statistical data and/or ** samples from the index being analyzed into the StatAccum object. ** The stat_get() SQL function will be used afterwards to ** retrieve the information gathered. ** ** This SQL function usually returns NULL, but might return an integer ** if it wants the byte-code to do special processing. ** ** The R parameter is only used for STAT4 */ static void statPush( sqlite3_context *context, int argc, sqlite3_value **argv ){ int i; /* The three function arguments */ StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); int iChng = sqlite3_value_int(argv[1]); UNUSED_PARAMETER( argc ); UNUSED_PARAMETER( context ); assert( p->nCol>0 ); assert( iChng<p->nCol ); if( p->nRow==0 ){ /* This is the first call to this function. Do initialization. */ for(i=0; i<p->nCol; i++) p->current.anEq[i] = 1; }else{ /* Second and subsequent calls get processed here */ #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ) samplePushPrevious(p, iChng); #endif /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply ** to the current row of the index. */ for(i=0; i<iChng; i++){ p->current.anEq[i]++; } for(i=iChng; i<p->nCol; i++){ p->current.anDLt[i]++; #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; #endif p->current.anEq[i] = 1; } } p->nRow++; #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ){ tRowcnt nLt; if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); }else{ sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), sqlite3_value_blob(argv[2])); } p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; nLt = p->current.anLt[p->nCol-1]; /* Check if this is to be a periodic sample. If so, add it. */ if( (nLt/p->nPSample)!=(nLt+1)/p->nPSample ){ p->current.isPSample = 1; p->current.iCol = 0; sampleInsert(p, &p->current, p->nCol-1); p->current.isPSample = 0; } /* Update the aBest[] array. */ for(i=0; i<(p->nCol-1); i++){ p->current.iCol = i; if( i>=iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i]) ){ sampleCopy(p, &p->aBest[i], &p->current); } } }else #endif if( p->nLimit && p->nRow>(tRowcnt)p->nLimit*(p->nSkipAhead+1) ){ p->nSkipAhead++; sqlite3_result_int(context, p->current.anDLt[0]>0); } } static const FuncDef statPushFuncdef = { 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ statPush, /* xSFunc */ 0, /* xFinalize */ |
107131 107132 107133 107134 107135 107136 107137 | #define STAT_GET_NEQ 2 /* "neq" column of stat[34] entry */ #define STAT_GET_NLT 3 /* "nlt" column of stat[34] entry */ #define STAT_GET_NDLT 4 /* "ndlt" column of stat[34] entry */ /* ** Implementation of the stat_get(P,J) SQL function. This routine is ** used to query statistical information that has been gathered into | | | | | > | | 107963 107964 107965 107966 107967 107968 107969 107970 107971 107972 107973 107974 107975 107976 107977 107978 107979 107980 107981 107982 107983 107984 107985 107986 107987 107988 107989 107990 107991 107992 107993 107994 107995 107996 107997 107998 107999 108000 108001 108002 108003 108004 108005 108006 108007 108008 108009 108010 108011 108012 108013 108014 108015 108016 108017 108018 108019 108020 | #define STAT_GET_NEQ 2 /* "neq" column of stat[34] entry */ #define STAT_GET_NLT 3 /* "nlt" column of stat[34] entry */ #define STAT_GET_NDLT 4 /* "ndlt" column of stat[34] entry */ /* ** Implementation of the stat_get(P,J) SQL function. This routine is ** used to query statistical information that has been gathered into ** the StatAccum object by prior calls to stat_push(). The P parameter ** has type BLOB but it is really just a pointer to the StatAccum object. ** The content to returned is determined by the parameter J ** which is one of the STAT_GET_xxxx values defined above. ** ** The stat_get(P,J) function is not available to generic SQL. It is ** inserted as part of a manually constructed bytecode program. (See ** the callStatGet() routine below.) It is guaranteed that the P ** parameter will always be a pointer to a StatAccum object, never a ** NULL. ** ** If STAT4 is not enabled, then J is always ** STAT_GET_STAT1 and is hence omitted and this routine becomes ** a one-parameter function, stat_get(P), that always returns the ** stat1 table entry information. */ static void statGet( sqlite3_context *context, int argc, sqlite3_value **argv ){ StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); #ifdef SQLITE_ENABLE_STAT4 /* STAT4 has a parameter on this routine. */ int eCall = sqlite3_value_int(argv[1]); assert( argc==2 ); assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT || eCall==STAT_GET_NDLT ); assert( eCall==STAT_GET_STAT1 || p->mxSample ); if( eCall==STAT_GET_STAT1 ) #else assert( argc==1 ); #endif { /* Return the value to store in the "stat" column of the sqlite_stat1 ** table for this index. ** ** The value is a string composed of a list of integers describing ** the index. The first integer in the list is the total number of ** entries in the index. There is one additional integer in the list ** for each indexed column. This additional integer is an estimate of ** the number of rows matched by a equality query on the index using ** a key with the corresponding number of fields. In other words, ** if the index is on columns (a,b) and the sqlite_stat1 value is ** "100 10 2", then SQLite estimates that: ** ** * the index contains 100 rows, ** * "WHERE a=?" matches 10 rows, and ** * "WHERE a=? AND b=?" matches 2 rows. |
107196 107197 107198 107199 107200 107201 107202 | char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); if( zRet==0 ){ sqlite3_result_error_nomem(context); return; } | | > | | 108029 108030 108031 108032 108033 108034 108035 108036 108037 108038 108039 108040 108041 108042 108043 108044 108045 108046 108047 108048 108049 108050 108051 108052 108053 108054 108055 108056 108057 108058 108059 108060 108061 108062 108063 108064 | char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); if( zRet==0 ){ sqlite3_result_error_nomem(context); return; } sqlite3_snprintf(24, zRet, "%llu", p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); z = zRet + sqlite3Strlen30(zRet); for(i=0; i<p->nKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; sqlite3_snprintf(24, z, " %llu", iVal); z += sqlite3Strlen30(z); assert( p->current.anEq[i] ); } assert( z[0]=='\0' && z>zRet ); sqlite3_result_text(context, zRet, -1, sqlite3_free); } #ifdef SQLITE_ENABLE_STAT4 else if( eCall==STAT_GET_ROWID ){ if( p->iGet<0 ){ samplePushPrevious(p, 0); p->iGet = 0; } if( p->iGet<p->nSample ){ StatSample *pS = p->a + p->iGet; if( pS->nRowid==0 ){ sqlite3_result_int64(context, pS->u.iRowid); }else{ sqlite3_result_blob(context, pS->u.aRowid, pS->nRowid, SQLITE_TRANSIENT); } } |
107272 107273 107274 107275 107276 107277 107278 | statGet, /* xSFunc */ 0, /* xFinalize */ 0, 0, /* xValue, xInverse */ "stat_get", /* zName */ {0} }; | | | | | | 108106 108107 108108 108109 108110 108111 108112 108113 108114 108115 108116 108117 108118 108119 108120 108121 108122 108123 108124 108125 108126 108127 108128 108129 | statGet, /* xSFunc */ 0, /* xFinalize */ 0, 0, /* xValue, xInverse */ "stat_get", /* zName */ {0} }; static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ #ifdef SQLITE_ENABLE_STAT4 sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat+1); #elif SQLITE_DEBUG assert( iParam==STAT_GET_STAT1 ); #else UNUSED_PARAMETER( iParam ); #endif assert( regOut!=regStat && regOut!=regStat+1 ); sqlite3VdbeAddFunctionCall(pParse, 0, regStat, regOut, 1+IsStat4, &statGetFuncdef, 0); } /* ** Generate code to do an analysis of all indices associated with ** a single table. */ |
107307 107308 107309 107310 107311 107312 107313 | int iTabCur; /* Table cursor */ Vdbe *v; /* The virtual machine being built up */ int i; /* Loop counter */ int jZeroRows = -1; /* Jump from here if number of rows is zero */ int iDb; /* Index of database containing pTab */ u8 needTableCnt = 1; /* True to count the table */ int regNewRowid = iMem++; /* Rowid for the inserted record */ | | < < > | 108141 108142 108143 108144 108145 108146 108147 108148 108149 108150 108151 108152 108153 108154 108155 108156 108157 108158 108159 | int iTabCur; /* Table cursor */ Vdbe *v; /* The virtual machine being built up */ int i; /* Loop counter */ int jZeroRows = -1; /* Jump from here if number of rows is zero */ int iDb; /* Index of database containing pTab */ u8 needTableCnt = 1; /* True to count the table */ int regNewRowid = iMem++; /* Rowid for the inserted record */ int regStat = iMem++; /* Register to hold StatAccum object */ int regChng = iMem++; /* Index of changed index field */ int regRowid = iMem++; /* Rowid argument passed to stat_push() */ int regTemp = iMem++; /* Temporary use register */ int regTemp2 = iMem++; /* Second temporary use register */ int regTabname = iMem++; /* Register containing table name */ int regIdxname = iMem++; /* Register containing index name */ int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ int regPrev = iMem; /* MUST BE LAST (see below) */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK Table *pStat1 = 0; #endif |
107440 107441 107442 107443 107444 107445 107446 | VdbeComment((v, "%s", pIdx->zName)); /* Invoke the stat_init() function. The arguments are: ** ** (1) the number of columns in the index including the rowid ** (or for a WITHOUT ROWID table, the number of PK columns), ** (2) the number of columns in the key without the rowid/pk | | < < < > > > > | > > > > | > > > > | | < < | 108273 108274 108275 108276 108277 108278 108279 108280 108281 108282 108283 108284 108285 108286 108287 108288 108289 108290 108291 108292 108293 108294 108295 108296 108297 108298 108299 108300 108301 108302 108303 108304 108305 108306 108307 108308 108309 108310 108311 108312 108313 108314 108315 108316 | VdbeComment((v, "%s", pIdx->zName)); /* Invoke the stat_init() function. The arguments are: ** ** (1) the number of columns in the index including the rowid ** (or for a WITHOUT ROWID table, the number of PK columns), ** (2) the number of columns in the key without the rowid/pk ** (3) estimated number of rows in the index, */ sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat+1); assert( regRowid==regStat+2 ); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); #ifdef SQLITE_ENABLE_STAT4 if( OptimizationEnabled(db, SQLITE_Stat4) ){ sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); VdbeCoverage(v); }else #endif { addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); } assert( regTemp2==regStat+4 ); sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, &statInitFuncdef, 0); /* Implementation of the following: ** ** Rewind csr ** if eof(csr) goto end_of_scan; ** regChng = 0 ** goto next_push_0; ** */ sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ int endDistinctTest = sqlite3VdbeMakeLabel(pParse); int *aGotoChng; /* Array of jump instruction addresses */ aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); |
107495 107496 107497 107498 107499 107500 107501 107502 107503 107504 107505 107506 107507 107508 107509 107510 107511 107512 107513 107514 107515 107516 107517 107518 107519 107520 107521 107522 107523 107524 107525 107526 107527 107528 107529 107530 107531 107532 107533 107534 | sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); VdbeCoverage(v); } for(i=0; i<nColTest; i++){ char *pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[i]); sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); sqlite3VdbeGoto(v, endDistinctTest); /* ** chng_addr_0: ** regPrev(0) = idx(0) ** chng_addr_1: ** regPrev(1) = idx(1) ** ... */ sqlite3VdbeJumpHere(v, addrNextRow-1); for(i=0; i<nColTest; i++){ sqlite3VdbeJumpHere(v, aGotoChng[i]); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regPrev+i); } sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); } /* ** chng_addr_N: ** regRowid = idx(rowid) // STAT4 only ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only ** Next csr ** if !eof(csr) goto next_row; */ #ifdef SQLITE_ENABLE_STAT4 | > > > | | | | | | | | | | | | | | | | > | > | | > > > > > > > | > > > > | > > | < > | | | | | 108335 108336 108337 108338 108339 108340 108341 108342 108343 108344 108345 108346 108347 108348 108349 108350 108351 108352 108353 108354 108355 108356 108357 108358 108359 108360 108361 108362 108363 108364 108365 108366 108367 108368 108369 108370 108371 108372 108373 108374 108375 108376 108377 108378 108379 108380 108381 108382 108383 108384 108385 108386 108387 108388 108389 108390 108391 108392 108393 108394 108395 108396 108397 108398 108399 108400 108401 108402 108403 108404 108405 108406 108407 108408 108409 108410 108411 108412 108413 108414 108415 108416 108417 108418 108419 108420 108421 108422 108423 108424 108425 108426 108427 108428 108429 108430 108431 108432 108433 108434 108435 108436 108437 108438 108439 108440 108441 108442 108443 108444 108445 108446 108447 108448 108449 108450 108451 108452 108453 108454 | sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); VdbeCoverage(v); } for(i=0; i<nColTest; i++){ char *pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[i]); sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); sqlite3VdbeGoto(v, endDistinctTest); /* ** chng_addr_0: ** regPrev(0) = idx(0) ** chng_addr_1: ** regPrev(1) = idx(1) ** ... */ sqlite3VdbeJumpHere(v, addrNextRow-1); for(i=0; i<nColTest; i++){ sqlite3VdbeJumpHere(v, aGotoChng[i]); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regPrev+i); VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); } sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); } /* ** chng_addr_N: ** regRowid = idx(rowid) // STAT4 only ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only ** Next csr ** if !eof(csr) goto next_row; */ #ifdef SQLITE_ENABLE_STAT4 if( OptimizationEnabled(db, SQLITE_Stat4) ){ assert( regRowid==(regStat+2) ); if( HasRowid(pTab) ){ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); int j, k, regKey; regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; j<pPk->nKeyCol; j++){ k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); assert( k>=0 && k<pIdx->nColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); } } #endif assert( regChng==(regStat+1) ); { sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, &statPushFuncdef, 0); if( db->nAnalysisLimit ){ int j1, j2, j3; j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); VdbeCoverage(v); j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); VdbeCoverage(v); j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, j1); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); sqlite3VdbeJumpHere(v, j2); sqlite3VdbeJumpHere(v, j3); }else{ sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); } } /* Add the entry to the stat1 table. */ callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); assert( "BBB"[0]==SQLITE_AFF_TEXT ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); #endif sqlite3VdbeChangeP5(v, OPFLAG_APPEND); /* Add the entries to the stat4 table. */ #ifdef SQLITE_ENABLE_STAT4 if( OptimizationEnabled(db, SQLITE_Stat4) && db->nAnalysisLimit==0 ){ int regEq = regStat1; int regLt = regStat1+1; int regDLt = regStat1+2; int regSample = regStat1+3; int regCol = regStat1+4; int regSampleRowid = regCol + nCol; int addrNext; int addrIsNull; u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound; pParse->nMem = MAX(pParse->nMem, regCol+nCol); addrNext = sqlite3VdbeCurrentAddr(v); callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); VdbeCoverage(v); callStatGet(pParse, regStat, STAT_GET_NEQ, regEq); callStatGet(pParse, regStat, STAT_GET_NLT, regLt); callStatGet(pParse, regStat, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); VdbeCoverage(v); for(i=0; i<nCol; i++){ sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, i, regCol+i); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regCol, nCol, regSample); sqlite3VdbeAddOp3(v, OP_MakeRecord, regTabname, 6, regTemp); |
108275 108276 108277 108278 108279 108280 108281 108282 108283 108284 108285 108286 108287 108288 | rc = sqlite3ResolveExprNames(pName, pExpr); }else{ pExpr->op = TK_STRING; } } return rc; } /* ** An SQL user-function registered to do the work of an ATTACH statement. The ** three arguments to the function come directly from an attach statement: ** ** ATTACH DATABASE x AS y KEY z ** | > > > > > > > > > > > | 109133 109134 109135 109136 109137 109138 109139 109140 109141 109142 109143 109144 109145 109146 109147 109148 109149 109150 109151 109152 109153 109154 109155 109156 109157 | rc = sqlite3ResolveExprNames(pName, pExpr); }else{ pExpr->op = TK_STRING; } } return rc; } /* ** Return true if zName points to a name that may be used to refer to ** database iDb attached to handle db. */ SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName){ return ( sqlite3StrICmp(db->aDb[iDb].zDbSName, zName)==0 || (iDb==0 && sqlite3StrICmp("main", zName)==0) ); } /* ** An SQL user-function registered to do the work of an ATTACH statement. The ** three arguments to the function come directly from an attach statement: ** ** ATTACH DATABASE x AS y KEY z ** |
108348 108349 108350 108351 108352 108353 108354 | if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", db->aLimit[SQLITE_LIMIT_ATTACHED] ); goto attach_error; } for(i=0; i<db->nDb; i++){ | < | | | 109217 109218 109219 109220 109221 109222 109223 109224 109225 109226 109227 109228 109229 109230 109231 109232 | if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", db->aLimit[SQLITE_LIMIT_ATTACHED] ); goto attach_error; } for(i=0; i<db->nDb; i++){ assert( zName ); if( sqlite3DbIsNamed(db, i, zName) ){ zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); goto attach_error; } } /* Allocate the new entry in the db->aDb[] array and initialize the schema ** hash tables. |
108418 108419 108420 108421 108422 108423 108424 | #endif sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | 109286 109287 109288 109289 109290 109291 109292 109293 109294 109295 109296 109297 109298 109299 109300 | #endif sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } sqlite3_free_filename( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and ** remove the entry from the db->aDb[] array. i.e. put everything back the ** way we found it. */ if( rc==SQLITE_OK ){ |
108538 108539 108540 108541 108542 108543 108544 | UNUSED_PARAMETER(NotUsed); if( zName==0 ) zName = ""; for(i=0; i<db->nDb; i++){ pDb = &db->aDb[i]; if( pDb->pBt==0 ) continue; | | | 109371 109372 109373 109374 109375 109376 109377 109378 109379 109380 109381 109382 109383 109384 109385 | UNUSED_PARAMETER(NotUsed); if( zName==0 ) zName = ""; for(i=0; i<db->nDb; i++){ pDb = &db->aDb[i]; if( pDb->pBt==0 ) continue; if( sqlite3DbIsNamed(db, i, zName) ) break; } if( i>=db->nDb ){ sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); goto detach_error; } if( i<2 ){ |
108729 108730 108731 108732 108733 108734 108735 | ** checks out, these routines return 0. */ SQLITE_PRIVATE int sqlite3FixSrcList( DbFixer *pFix, /* Context of the fixation */ SrcList *pList /* The Source list to check and modify */ ){ int i; | < > > | | | | 109562 109563 109564 109565 109566 109567 109568 109569 109570 109571 109572 109573 109574 109575 109576 109577 109578 109579 109580 109581 109582 109583 109584 109585 109586 109587 109588 109589 109590 | ** checks out, these routines return 0. */ SQLITE_PRIVATE int sqlite3FixSrcList( DbFixer *pFix, /* Context of the fixation */ SrcList *pList /* The Source list to check and modify */ ){ int i; struct SrcList_item *pItem; sqlite3 *db = pFix->pParse->db; int iDb = sqlite3FindDbName(db, pFix->zDb); if( NEVER(pList==0) ) return 0; for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){ if( pFix->bTemp==0 ){ if( pItem->zDatabase && iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){ sqlite3ErrorMsg(pFix->pParse, "%s %T cannot reference objects in database %s", pFix->zType, pFix->pName, pItem->zDatabase); return 1; } sqlite3DbFree(db, pItem->zDatabase); pItem->zDatabase = 0; pItem->pSchema = pFix->pSchema; pItem->fg.fromDDL = 1; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; |
109464 109465 109466 109467 109468 109469 109470 | #if SQLITE_USER_AUTHENTICATION /* Only the admin user is allowed to know that the sqlite_user table ** exists */ if( db->auth.authLevel<UAUTH_Admin && sqlite3UserAuthTable(zName)!=0 ){ return 0; } #endif | | | < | > > > > | | > | | < | | | | > > > > > > > > > > > > > > | | 110298 110299 110300 110301 110302 110303 110304 110305 110306 110307 110308 110309 110310 110311 110312 110313 110314 110315 110316 110317 110318 110319 110320 110321 110322 110323 110324 110325 110326 110327 110328 110329 110330 110331 110332 110333 110334 110335 110336 110337 110338 110339 110340 110341 110342 110343 110344 | #if SQLITE_USER_AUTHENTICATION /* Only the admin user is allowed to know that the sqlite_user table ** exists */ if( db->auth.authLevel<UAUTH_Admin && sqlite3UserAuthTable(zName)!=0 ){ return 0; } #endif if( zDatabase ){ for(i=0; i<db->nDb; i++){ if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break; } if( i>=db->nDb ){ /* No match against the official names. But always match "main" ** to schema 0 as a legacy fallback. */ if( sqlite3StrICmp(zDatabase,"main")==0 ){ i = 0; }else{ return 0; } } p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){ /* All temp.sqlite_master to be an alias for sqlite_temp_master */ p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME); } }else{ /* Match against TEMP first */ p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName); if( p ) return p; /* The main database is second */ p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName); if( p ) return p; /* Attached databases are in order of attachment */ for(i=2; i<db->nDb; i++){ assert( sqlite3SchemaMutexHeld(db, i, 0) ); p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); if( p ) break; } } return p; } /* ** Locate the in-memory structure that describes a particular database ** table given the name of that table and (optionally) the name of the ** database containing the table. Return NULL if not found. Also leave an ** error message in pParse->zErrMsg. |
109589 109590 109591 109592 109593 109594 109595 | int i; /* All mutexes are required for schema access. Make sure we hold them. */ assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; assert( pSchema ); | | | 110440 110441 110442 110443 110444 110445 110446 110447 110448 110449 110450 110451 110452 110453 110454 | int i; /* All mutexes are required for schema access. Make sure we hold them. */ assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; assert( pSchema ); if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; assert( sqlite3SchemaMutexHeld(db, j, 0) ); p = sqlite3HashFind(&pSchema->idxHash, zName); if( p ) break; } return p; } |
109742 109743 109744 109745 109746 109747 109748 109749 109750 109751 109752 109753 109754 109755 | */ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ int i; Column *pCol; assert( pTable!=0 ); if( (pCol = pTable->aCol)!=0 ){ for(i=0; i<pTable->nCol; i++, pCol++){ sqlite3DbFree(db, pCol->zName); sqlite3ExprDelete(db, pCol->pDflt); sqlite3DbFree(db, pCol->zColl); } sqlite3DbFree(db, pTable->aCol); } } | > | 110593 110594 110595 110596 110597 110598 110599 110600 110601 110602 110603 110604 110605 110606 110607 | */ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ int i; Column *pCol; assert( pTable!=0 ); if( (pCol = pTable->aCol)!=0 ){ for(i=0; i<pTable->nCol; i++, pCol++){ assert( pCol->zName==0 || pCol->hName==sqlite3StrIHash(pCol->zName) ); sqlite3DbFree(db, pCol->zName); sqlite3ExprDelete(db, pCol->pDflt); sqlite3DbFree(db, pCol->zColl); } sqlite3DbFree(db, pTable->aCol); } } |
110390 110391 110392 110393 110394 110395 110396 110397 110398 110399 110400 110401 110402 110403 | return; } p->aCol = aNew; } pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; sqlite3ColumnPropertiesFromName(p, pCol); if( pType->n==0 ){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ pCol->affinity = SQLITE_AFF_BLOB; pCol->szEst = 1; | > | 111242 111243 111244 111245 111246 111247 111248 111249 111250 111251 111252 111253 111254 111255 111256 | return; } p->aCol = aNew; } pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; pCol->hName = sqlite3StrIHash(z); sqlite3ColumnPropertiesFromName(p, pCol); if( pType->n==0 ){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ pCol->affinity = SQLITE_AFF_BLOB; pCol->szEst = 1; |
111281 111282 111283 111284 111285 111286 111287 111288 111289 111290 111291 111292 111293 111294 111295 111296 111297 111298 | } } assert( pPk->nColumn==j ); assert( pTab->nNVCol<=j ); recomputeColumnsNotIndexed(pPk); } #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Return true if zName is a shadow table name in the current database ** connection. ** ** zName is temporarily modified while this routine is running, but is ** restored to its original value prior to this routine returning. */ SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ char *zTail; /* Pointer to the last "_" in zName */ Table *pTab; /* Table that zName is a shadow of */ | > > > > > > > > > > > > > > > > > > > > > > < < < | > > | | > > > > > > > > > | > > > > > > > > > > > > > | | 112134 112135 112136 112137 112138 112139 112140 112141 112142 112143 112144 112145 112146 112147 112148 112149 112150 112151 112152 112153 112154 112155 112156 112157 112158 112159 112160 112161 112162 112163 112164 112165 112166 112167 112168 112169 112170 112171 112172 112173 112174 112175 112176 112177 112178 112179 112180 112181 112182 112183 112184 112185 112186 112187 112188 112189 112190 112191 112192 112193 112194 112195 112196 112197 112198 112199 112200 112201 112202 112203 112204 112205 112206 112207 112208 112209 112210 112211 112212 112213 112214 112215 112216 112217 | } } assert( pPk->nColumn==j ); assert( pTab->nNVCol<=j ); recomputeColumnsNotIndexed(pPk); } #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Return true if pTab is a virtual table and zName is a shadow table name ** for that virtual table. */ SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){ int nName; /* Length of zName */ Module *pMod; /* Module for the virtual table */ if( !IsVirtual(pTab) ) return 0; nName = sqlite3Strlen30(pTab->zName); if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; if( zName[nName]!='_' ) return 0; pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); if( pMod==0 ) return 0; if( pMod->pModule->iVersion<3 ) return 0; if( pMod->pModule->xShadowName==0 ) return 0; return pMod->pModule->xShadowName(zName+nName+1); } #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Return true if zName is a shadow table name in the current database ** connection. ** ** zName is temporarily modified while this routine is running, but is ** restored to its original value prior to this routine returning. */ SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ char *zTail; /* Pointer to the last "_" in zName */ Table *pTab; /* Table that zName is a shadow of */ zTail = strrchr(zName, '_'); if( zTail==0 ) return 0; *zTail = 0; pTab = sqlite3FindTable(db, zName, 0); *zTail = '_'; if( pTab==0 ) return 0; if( !IsVirtual(pTab) ) return 0; return sqlite3IsShadowTableOf(db, pTab, zName); } #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ #ifdef SQLITE_DEBUG /* ** Mark all nodes of an expression as EP_Immutable, indicating that ** they should not be changed. Expressions attached to a table or ** index definition are tagged this way to help ensure that we do ** not pass them into code generator routines by mistake. */ static int markImmutableExprStep(Walker *pWalker, Expr *pExpr){ ExprSetVVAProperty(pExpr, EP_Immutable); return WRC_Continue; } static void markExprListImmutable(ExprList *pList){ if( pList ){ Walker w; memset(&w, 0, sizeof(w)); w.xExprCallback = markImmutableExprStep; w.xSelectCallback = sqlite3SelectWalkNoop; w.xSelectCallback2 = 0; sqlite3WalkExprList(&w, pList); } } #else #define markExprListImmutable(X) /* no-op */ #endif /* SQLITE_DEBUG */ /* ** This routine is called to report the final ")" that terminates ** a CREATE TABLE statement. ** ** The table structure that other action routines have been building ** is added to the internal hash tables, assuming no errors have |
111401 111402 111403 111404 111405 111406 111407 111408 111409 111410 111411 111412 111413 111414 | if( p->pCheck ){ sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); if( pParse->nErr ){ /* If errors are seen, delete the CHECK constraints now, else they might ** actually be used if PRAGMA writable_schema=ON is set. */ sqlite3ExprListDelete(db, p->pCheck); p->pCheck = 0; } } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( p->tabFlags & TF_HasGenerated ){ int ii, nNG = 0; testcase( p->tabFlags & TF_HasVirtual ); | > > | 112297 112298 112299 112300 112301 112302 112303 112304 112305 112306 112307 112308 112309 112310 112311 112312 | if( p->pCheck ){ sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); if( pParse->nErr ){ /* If errors are seen, delete the CHECK constraints now, else they might ** actually be used if PRAGMA writable_schema=ON is set. */ sqlite3ExprListDelete(db, p->pCheck); p->pCheck = 0; }else{ markExprListImmutable(p->pCheck); } } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( p->tabFlags & TF_HasGenerated ){ int ii, nNG = 0; testcase( p->tabFlags & TF_HasVirtual ); |
113752 113753 113754 113755 113756 113757 113758 | sqlite3ErrorMsg(pParse, "unable to open a temporary database " "file for storing temporary tables"); pParse->rc = rc; return 1; } db->aDb[1].pBt = pBt; assert( db->aDb[1].pSchema ); | | | 114650 114651 114652 114653 114654 114655 114656 114657 114658 114659 114660 114661 114662 114663 114664 | sqlite3ErrorMsg(pParse, "unable to open a temporary database " "file for storing temporary tables"); pParse->rc = rc; return 1; } db->aDb[1].pBt = pBt; assert( db->aDb[1].pSchema ); if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, 0, 0) ){ sqlite3OomFault(db); return 1; } } return 0; } |
113863 113864 113865 113866 113867 113868 113869 | int errCode, /* extended error code */ int onError, /* Constraint type */ char *p4, /* Error message */ i8 p4type, /* P4_STATIC or P4_TRANSIENT */ u8 p5Errmsg /* P5_ErrMsg type */ ){ Vdbe *v = sqlite3GetVdbe(pParse); | | | 114761 114762 114763 114764 114765 114766 114767 114768 114769 114770 114771 114772 114773 114774 114775 | int errCode, /* extended error code */ int onError, /* Constraint type */ char *p4, /* Error message */ i8 p4type, /* P4_STATIC or P4_TRANSIENT */ u8 p5Errmsg /* P5_ErrMsg type */ ){ Vdbe *v = sqlite3GetVdbe(pParse); assert( (errCode&0xff)==SQLITE_CONSTRAINT || pParse->nested ); if( onError==OE_Abort ){ sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); sqlite3VdbeChangeP5(v, p5Errmsg); } |
114342 114343 114344 114345 114346 114347 114348 114349 114350 114351 114352 114353 | SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( sqlite3 *db, /* Database connection to search */ u8 enc, /* Desired text encoding */ const char *zName, /* Name of the collating sequence. Might be NULL */ int create /* True to create CollSeq if doesn't already exist */ ){ CollSeq *pColl; if( zName ){ pColl = findCollSeqEntry(db, zName, create); }else{ pColl = db->pDfltColl; } | > > > < < < > > > > > > > > > > > > > | 115240 115241 115242 115243 115244 115245 115246 115247 115248 115249 115250 115251 115252 115253 115254 115255 115256 115257 115258 115259 115260 115261 115262 115263 115264 115265 115266 115267 115268 115269 115270 115271 115272 115273 115274 115275 115276 | SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( sqlite3 *db, /* Database connection to search */ u8 enc, /* Desired text encoding */ const char *zName, /* Name of the collating sequence. Might be NULL */ int create /* True to create CollSeq if doesn't already exist */ ){ CollSeq *pColl; assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); if( zName ){ pColl = findCollSeqEntry(db, zName, create); if( pColl ) pColl += enc-1; }else{ pColl = db->pDfltColl; } return pColl; } /* ** Change the text encoding for a database connection. This means that ** the pDfltColl must change as well. */ SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); db->enc = enc; /* EVIDENCE-OF: R-08308-17224 The default collating function for all ** strings is BINARY. */ db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0); } /* ** This function is responsible for invoking the collation factory callback ** or substituting a collation sequence of a different encoding when the ** requested collation sequence is not available in the desired encoding. ** ** If it is not NULL, then pColl must point to the database native encoding |
115238 115239 115240 115241 115242 115243 115244 | iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } testcase( IsVirtual(pTab) ); sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, iTabCur, aToOpen, &iDataCur, &iIdxCur); assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); | | > > | 116149 116150 116151 116152 116153 116154 116155 116156 116157 116158 116159 116160 116161 116162 116163 116164 116165 | iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } testcase( IsVirtual(pTab) ); sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, iTabCur, aToOpen, &iDataCur, &iIdxCur); assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); if( eOnePass==ONEPASS_MULTI ){ sqlite3VdbeJumpHereOrPopInst(v, iAddrOnce); } } /* Set up a loop over the rowids/primary-keys that were found in the ** where-clause loop above. */ if( eOnePass!=ONEPASS_OFF ){ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ |
115561 115562 115563 115564 115565 115566 115567 115568 115569 115570 115571 115572 115573 115574 | if( pIdx==pPk ) continue; if( iIdxCur+i==iIdxNoSeek ) continue; VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, &iPartIdxLabel, pPrior, r1); sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); pPrior = pIdx; } } /* ** Generate code that will assemble an index key and stores it in register | > | 116474 116475 116476 116477 116478 116479 116480 116481 116482 116483 116484 116485 116486 116487 116488 | if( pIdx==pPk ) continue; if( iIdxCur+i==iIdxNoSeek ) continue; VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, &iPartIdxLabel, pPrior, r1); sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); sqlite3VdbeChangeP5(v, 1); /* Cause IdxDelete to error if no entry found */ sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); pPrior = pIdx; } } /* ** Generate code that will assemble an index key and stores it in register |
116524 116525 116526 116527 116528 116529 116530 116531 116532 116533 116534 116535 116536 116537 | sqlite3_value **argv ){ const unsigned char *zA, *zB; u32 escape; int nPat; sqlite3 *db = sqlite3_context_db_handle(context); struct compareInfo *pInfo = sqlite3_user_data(context); #ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS if( sqlite3_value_type(argv[0])==SQLITE_BLOB || sqlite3_value_type(argv[1])==SQLITE_BLOB ){ #ifdef SQLITE_TEST sqlite3_like_count++; | > | 117438 117439 117440 117441 117442 117443 117444 117445 117446 117447 117448 117449 117450 117451 117452 | sqlite3_value **argv ){ const unsigned char *zA, *zB; u32 escape; int nPat; sqlite3 *db = sqlite3_context_db_handle(context); struct compareInfo *pInfo = sqlite3_user_data(context); struct compareInfo backupInfo; #ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS if( sqlite3_value_type(argv[0])==SQLITE_BLOB || sqlite3_value_type(argv[1])==SQLITE_BLOB ){ #ifdef SQLITE_TEST sqlite3_like_count++; |
116559 116560 116561 116562 116563 116564 116565 116566 116567 116568 116569 116570 116571 116572 | if( zEsc==0 ) return; if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } escape = sqlite3Utf8Read(&zEsc); }else{ escape = pInfo->matchSet; } zB = sqlite3_value_text(argv[0]); zA = sqlite3_value_text(argv[1]); if( zA && zB ){ #ifdef SQLITE_TEST | > > > > > > | 117474 117475 117476 117477 117478 117479 117480 117481 117482 117483 117484 117485 117486 117487 117488 117489 117490 117491 117492 117493 | if( zEsc==0 ) return; if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } escape = sqlite3Utf8Read(&zEsc); if( escape==pInfo->matchAll || escape==pInfo->matchOne ){ memcpy(&backupInfo, pInfo, sizeof(backupInfo)); pInfo = &backupInfo; if( escape==pInfo->matchAll ) pInfo->matchAll = 0; if( escape==pInfo->matchOne ) pInfo->matchOne = 0; } }else{ escape = pInfo->matchSet; } zB = sqlite3_value_text(argv[0]); zA = sqlite3_value_text(argv[1]); if( zA && zB ){ #ifdef SQLITE_TEST |
116947 116948 116949 116950 116951 116952 116953 | } cntExpand++; if( (cntExpand&(cntExpand-1))==0 ){ /* Grow the size of the output buffer only on substitutions ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ u8 *zOld; zOld = zOut; | | | 117868 117869 117870 117871 117872 117873 117874 117875 117876 117877 117878 117879 117880 117881 117882 | } cntExpand++; if( (cntExpand&(cntExpand-1))==0 ){ /* Grow the size of the output buffer only on substitutions ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ u8 *zOld; zOld = zOut; zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1)); if( zOut==0 ){ sqlite3_result_error_nomem(context); sqlite3_free(zOld); return; } } } |
117541 117542 117543 117544 117545 117546 117547 | pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION if( pDef==0 ) return 0; #endif if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ return 0; } | < < < < < < < < < < > > > > > > > > > > > > > > | 118462 118463 118464 118465 118466 118467 118468 118469 118470 118471 118472 118473 118474 118475 118476 118477 118478 118479 118480 118481 118482 118483 118484 118485 118486 118487 118488 118489 118490 118491 118492 118493 118494 118495 118496 118497 118498 | pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION if( pDef==0 ) return 0; #endif if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ return 0; } /* The memcpy() statement assumes that the wildcard characters are ** the first three statements in the compareInfo structure. The ** asserts() that follow verify that assumption */ memcpy(aWc, pDef->pUserData, 3); assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); if( nExpr<3 ){ aWc[3] = 0; }else{ Expr *pEscape = pExpr->x.pList->a[2].pExpr; char *zEscape; if( pEscape->op!=TK_STRING ) return 0; zEscape = pEscape->u.zToken; if( zEscape[0]==0 || zEscape[1]!=0 ) return 0; if( zEscape[0]==aWc[0] ) return 0; if( zEscape[0]==aWc[1] ) return 0; aWc[3] = zEscape[0]; } *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE)==0; return 1; } /* ** All of the FuncDef structures in the aBuiltinFunc[] array above ** to the global function hash table. This occurs at start-time (as |
117640 117641 117642 117643 117644 117645 117646 | #ifndef SQLITE_OMIT_FLOATING_POINT FUNCTION(round, 1, 0, 0, roundFunc ), FUNCTION(round, 2, 0, 0, roundFunc ), #endif FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), | | | 118565 118566 118567 118568 118569 118570 118571 118572 118573 118574 118575 118576 118577 118578 118579 | #ifndef SQLITE_OMIT_FLOATING_POINT FUNCTION(round, 1, 0, 0, roundFunc ), FUNCTION(round, 2, 0, 0, roundFunc ), #endif FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ), DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), FUNCTION(quote, 1, 0, 0, quoteFunc ), |
117680 117681 117682 117683 117684 117685 117686 | LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), #endif #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUNCTION(unknown, -1, 0, 0, unknownFunc ), #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), | | > | 118605 118606 118607 118608 118609 118610 118611 118612 118613 118614 118615 118616 118617 118618 118619 118620 | LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), #endif #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUNCTION(unknown, -1, 0, 0, unknownFunc ), #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); #endif sqlite3WindowFunctions(); sqlite3RegisterDateTimeFunctions(); sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); |
118368 118369 118370 118371 118372 118373 118374 | sqlite3WhereEnd(pWInfo); } } /* Clean up the WHERE clause constructed above. */ sqlite3ExprDelete(db, pWhere); if( iFkIfZero ){ | | | 119294 119295 119296 119297 119298 119299 119300 119301 119302 119303 119304 119305 119306 119307 119308 | sqlite3WhereEnd(pWInfo); } } /* Clean up the WHERE clause constructed above. */ sqlite3ExprDelete(db, pWhere); if( iFkIfZero ){ sqlite3VdbeJumpHereOrPopInst(v, iFkIfZero); } } /* ** This function returns a linked list of FKey objects (connected by ** FKey.pNextTo) holding all children of table pTab. For example, ** given the following schema: |
120830 120831 120832 120833 120834 120835 120836 120837 120838 120839 120840 120841 120842 120843 | Expr *pExpr = pCheck->a[i].pExpr; if( aiChng && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) ){ /* The check constraints do not reference any of the columns being ** updated so there is no point it verifying the check constraint */ continue; } allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); pCopy = sqlite3ExprDup(db, pExpr, 0); if( !db->mallocFailed ){ sqlite3ExprIfTrue(pParse, pCopy, allOk, SQLITE_JUMPIFNULL); } | > > > > | 121756 121757 121758 121759 121760 121761 121762 121763 121764 121765 121766 121767 121768 121769 121770 121771 121772 121773 | Expr *pExpr = pCheck->a[i].pExpr; if( aiChng && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) ){ /* The check constraints do not reference any of the columns being ** updated so there is no point it verifying the check constraint */ continue; } if( bAffinityDone==0 ){ sqlite3TableAffinity(v, pTab, regNewData+1); bAffinityDone = 1; } allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); pCopy = sqlite3ExprDup(db, pExpr, 0); if( !db->mallocFailed ){ sqlite3ExprIfTrue(pParse, pCopy, allOk, SQLITE_JUMPIFNULL); } |
121336 121337 121338 121339 121340 121341 121342 121343 121344 121345 121346 121347 | VdbeOp x; /* Conflict check opcode to copy */ /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. ** Hence, make a complete copy of the opcode, rather than using ** a pointer to the opcode. */ x = *sqlite3VdbeGetOp(v, addrConflictCk); if( x.opcode!=OP_IdxRowid ){ int p2; /* New P2 value for copied conflict check opcode */ if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ p2 = lblRecheckOk; }else{ p2 = x.p2; } | > > | | 122266 122267 122268 122269 122270 122271 122272 122273 122274 122275 122276 122277 122278 122279 122280 122281 122282 122283 122284 122285 122286 122287 | VdbeOp x; /* Conflict check opcode to copy */ /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. ** Hence, make a complete copy of the opcode, rather than using ** a pointer to the opcode. */ x = *sqlite3VdbeGetOp(v, addrConflictCk); if( x.opcode!=OP_IdxRowid ){ int p2; /* New P2 value for copied conflict check opcode */ const char *zP4; if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ p2 = lblRecheckOk; }else{ p2 = x.p2; } zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z; sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type); sqlite3VdbeChangeP5(v, x.p5); VdbeCoverageIf(v, p2!=x.p2); } nConflictCk--; addrConflictCk++; } /* If the retest fails, issue an abort */ |
121949 121950 121951 121952 121953 121954 121955 | autoIncStep(pParse, regAutoinc, regRowid); }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } | < < | > | 122881 122882 122883 122884 122885 122886 122887 122888 122889 122890 122891 122892 122893 122894 122895 122896 122897 122898 122899 122900 122901 | autoIncStep(pParse, regAutoinc, regRowid); }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } if( db->mDbFlags & DBFLAG_Vacuum ){ sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); insFlags = OPFLAG_APPEND|OPFLAG_USESEEKRESULT; }else{ insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND; } sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); sqlite3VdbeAddOp4(v, OP_Insert, iDest, regData, regRowid, (char*)pDest, P4_TABLE); sqlite3VdbeChangeP5(v, insFlags); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); }else{ |
121981 121982 121983 121984 121985 121986 121987 | sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); VdbeComment((v, "%s", pSrcIdx->zName)); sqlite3VdbeAddOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest); sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); VdbeComment((v, "%s", pDestIdx->zName)); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); | < | 122912 122913 122914 122915 122916 122917 122918 122919 122920 122921 122922 122923 122924 122925 | sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); VdbeComment((v, "%s", pSrcIdx->zName)); sqlite3VdbeAddOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest); sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); VdbeComment((v, "%s", pDestIdx->zName)); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); if( db->mDbFlags & DBFLAG_Vacuum ){ /* This INSERT command is part of a VACUUM operation, which guarantees ** that the destination table is empty. If all indexed columns use ** collation sequence BINARY, then it can also be assumed that the ** index will be populated by inserting keys in strictly sorted ** order. In this case, instead of seeking within the b-tree as part ** of every OP_IdxInsert opcode, an OP_SeekEnd is added before the |
122005 122006 122007 122008 122009 122010 122011 | const char *zColl = pSrcIdx->azColl[i]; if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; } if( i==pSrcIdx->nColumn ){ idxInsFlags = OPFLAG_USESEEKRESULT; sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } | < | > | 122935 122936 122937 122938 122939 122940 122941 122942 122943 122944 122945 122946 122947 122948 122949 122950 122951 122952 | const char *zColl = pSrcIdx->azColl[i]; if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; } if( i==pSrcIdx->nColumn ){ idxInsFlags = OPFLAG_USESEEKRESULT; sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } }else if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ idxInsFlags |= OPFLAG_NCHANGE; } sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); sqlite3VdbeChangeP5(v, idxInsFlags|OPFLAG_APPEND); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); } |
122529 122530 122531 122532 122533 122534 122535 122536 122537 122538 122539 122540 122541 122542 | int (*drop_modules)(sqlite3*,const char**); /* Version 3.31.0 and later */ sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); const char *(*uri_key)(const char*,int); const char *(*filename_database)(const char*); const char *(*filename_journal)(const char*); const char *(*filename_wal)(const char*); }; /* ** This is the function signature used for all extension entry points. It ** is also defined in the file "loadext.c". */ typedef int (*sqlite3_loadext_entry)( | > > > > > | 123459 123460 123461 123462 123463 123464 123465 123466 123467 123468 123469 123470 123471 123472 123473 123474 123475 123476 123477 | int (*drop_modules)(sqlite3*,const char**); /* Version 3.31.0 and later */ sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); const char *(*uri_key)(const char*,int); const char *(*filename_database)(const char*); const char *(*filename_journal)(const char*); const char *(*filename_wal)(const char*); /* Version 3.32.0 and later */ char *(*create_filename)(const char*,const char*,const char*, int,const char**); void (*free_filename)(char*); sqlite3_file *(*database_file_object)(const char*); }; /* ** This is the function signature used for all extension entry points. It ** is also defined in the file "loadext.c". */ typedef int (*sqlite3_loadext_entry)( |
122829 122830 122831 122832 122833 122834 122835 122836 122837 122838 122839 122840 122841 122842 | #define sqlite3_drop_modules sqlite3_api->drop_modules /* Version 3.31.0 and later */ #define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 #define sqlite3_uri_key sqlite3_api->uri_key #define sqlite3_filename_database sqlite3_api->filename_database #define sqlite3_filename_journal sqlite3_api->filename_journal #define sqlite3_filename_wal sqlite3_api->filename_wal #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; # define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; | > > > > | 123764 123765 123766 123767 123768 123769 123770 123771 123772 123773 123774 123775 123776 123777 123778 123779 123780 123781 | #define sqlite3_drop_modules sqlite3_api->drop_modules /* Version 3.31.0 and later */ #define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 #define sqlite3_uri_key sqlite3_api->uri_key #define sqlite3_filename_database sqlite3_api->filename_database #define sqlite3_filename_journal sqlite3_api->filename_journal #define sqlite3_filename_wal sqlite3_api->filename_wal /* Version 3.32.0 and later */ #define sqlite3_create_filename sqlite3_api->create_filename #define sqlite3_free_filename sqlite3_api->free_filename #define sqlite3_database_file_object sqlite3_api->database_file_object #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; # define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; |
123307 123308 123309 123310 123311 123312 123313 123314 123315 123316 123317 123318 123319 123320 123321 | #endif /* Version 3.31.0 and later */ sqlite3_hard_heap_limit64, sqlite3_uri_key, sqlite3_filename_database, sqlite3_filename_journal, sqlite3_filename_wal, }; /* ** Attempt to load an SQLite extension library contained in the file ** zFile. The entry point is zProc. zProc may be 0 in which case a ** default entry point name (sqlite3_extension_init) is used. Use ** of the default name is recommended. ** | > > > > > > > > > > > > | 124246 124247 124248 124249 124250 124251 124252 124253 124254 124255 124256 124257 124258 124259 124260 124261 124262 124263 124264 124265 124266 124267 124268 124269 124270 124271 124272 | #endif /* Version 3.31.0 and later */ sqlite3_hard_heap_limit64, sqlite3_uri_key, sqlite3_filename_database, sqlite3_filename_journal, sqlite3_filename_wal, /* Version 3.32.0 and later */ sqlite3_create_filename, sqlite3_free_filename, sqlite3_database_file_object, }; /* True if x is the directory separator character */ #if SQLITE_OS_WIN # define DirSep(X) ((X)=='/'||(X)=='\\') #else # define DirSep(X) ((X)=='/') #endif /* ** Attempt to load an SQLite extension library contained in the file ** zFile. The entry point is zProc. zProc may be 0 in which case a ** default entry point name (sqlite3_extension_init) is used. Use ** of the default name is recommended. ** |
123410 123411 123412 123413 123414 123415 123416 | int ncFile = sqlite3Strlen30(zFile); zAltEntry = sqlite3_malloc64(ncFile+30); if( zAltEntry==0 ){ sqlite3OsDlClose(pVfs, handle); return SQLITE_NOMEM_BKPT; } memcpy(zAltEntry, "sqlite3_", 8); | | | 124361 124362 124363 124364 124365 124366 124367 124368 124369 124370 124371 124372 124373 124374 124375 | int ncFile = sqlite3Strlen30(zFile); zAltEntry = sqlite3_malloc64(ncFile+30); if( zAltEntry==0 ){ sqlite3OsDlClose(pVfs, handle); return SQLITE_NOMEM_BKPT; } memcpy(zAltEntry, "sqlite3_", 8); for(iFile=ncFile-1; iFile>=0 && !DirSep(zFile[iFile]); iFile--){} iFile++; if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ if( sqlite3Isalpha(c) ){ zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; } } |
123713 123714 123715 123716 123717 123718 123719 | /* 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. */ /* The various pragma types */ | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | 124664 124665 124666 124667 124668 124669 124670 124671 124672 124673 124674 124675 124676 124677 124678 124679 124680 124681 124682 124683 124684 124685 124686 124687 124688 124689 124690 124691 124692 124693 124694 124695 124696 124697 124698 124699 124700 124701 124702 124703 124704 124705 124706 124707 124708 124709 124710 124711 124712 124713 124714 124715 124716 124717 124718 124719 124720 | /* 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. */ /* The various pragma types */ #define PragTyp_ACTIVATE_EXTENSIONS 0 #define PragTyp_ANALYSIS_LIMIT 1 #define PragTyp_HEADER_VALUE 2 #define PragTyp_AUTO_VACUUM 3 #define PragTyp_FLAG 4 #define PragTyp_BUSY_TIMEOUT 5 #define PragTyp_CACHE_SIZE 6 #define PragTyp_CACHE_SPILL 7 #define PragTyp_CASE_SENSITIVE_LIKE 8 #define PragTyp_COLLATION_LIST 9 #define PragTyp_COMPILE_OPTIONS 10 #define PragTyp_DATA_STORE_DIRECTORY 11 #define PragTyp_DATABASE_LIST 12 #define PragTyp_DEFAULT_CACHE_SIZE 13 #define PragTyp_ENCODING 14 #define PragTyp_FOREIGN_KEY_CHECK 15 #define PragTyp_FOREIGN_KEY_LIST 16 #define PragTyp_FUNCTION_LIST 17 #define PragTyp_HARD_HEAP_LIMIT 18 #define PragTyp_INCREMENTAL_VACUUM 19 #define PragTyp_INDEX_INFO 20 #define PragTyp_INDEX_LIST 21 #define PragTyp_INTEGRITY_CHECK 22 #define PragTyp_JOURNAL_MODE 23 #define PragTyp_JOURNAL_SIZE_LIMIT 24 #define PragTyp_LOCK_PROXY_FILE 25 #define PragTyp_LOCKING_MODE 26 #define PragTyp_PAGE_COUNT 27 #define PragTyp_MMAP_SIZE 28 #define PragTyp_MODULE_LIST 29 #define PragTyp_OPTIMIZE 30 #define PragTyp_PAGE_SIZE 31 #define PragTyp_PRAGMA_LIST 32 #define PragTyp_SECURE_DELETE 33 #define PragTyp_SHRINK_MEMORY 34 #define PragTyp_SOFT_HEAP_LIMIT 35 #define PragTyp_SYNCHRONOUS 36 #define PragTyp_TABLE_INFO 37 #define PragTyp_TEMP_STORE 38 #define PragTyp_TEMP_STORE_DIRECTORY 39 #define PragTyp_THREADS 40 #define PragTyp_WAL_AUTOCHECKPOINT 41 #define PragTyp_WAL_CHECKPOINT 42 #define PragTyp_LOCK_STATUS 43 #define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ #define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ #define PragFlg_NoColumns1 0x04 /* zero columns if RHS argument is present */ |
123841 123842 123843 123844 123845 123846 123847 | u8 ePragTyp; /* PragTyp_XXX value */ u8 mPragFlg; /* Zero or more PragFlg_XXX values */ u8 iPragCName; /* Start of column names in pragCName[] */ u8 nPragCName; /* Num of col names. 0 means use pragma name */ u64 iArg; /* Extra argument */ } PragmaName; static const PragmaName aPragmaName[] = { | | > > > > > | 124792 124793 124794 124795 124796 124797 124798 124799 124800 124801 124802 124803 124804 124805 124806 124807 124808 124809 124810 124811 124812 124813 124814 124815 124816 124817 | u8 ePragTyp; /* PragTyp_XXX value */ u8 mPragFlg; /* Zero or more PragFlg_XXX values */ u8 iPragCName; /* Start of column names in pragCName[] */ u8 nPragCName; /* Num of col names. 0 means use pragma name */ u64 iArg; /* Extra argument */ } PragmaName; static const PragmaName aPragmaName[] = { #if defined(SQLITE_ENABLE_CEROD) {/* zName: */ "activate_extensions", /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif {/* zName: */ "analysis_limit", /* ePragTyp: */ PragTyp_ANALYSIS_LIMIT, /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) {/* zName: */ "application_id", /* ePragTyp: */ PragTyp_HEADER_VALUE, /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ BTREE_APPLICATION_ID }, #endif |
124037 124038 124039 124040 124041 124042 124043 | #endif #endif {/* zName: */ "hard_heap_limit", /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, | < < < < < < < < < < < < | 124993 124994 124995 124996 124997 124998 124999 125000 125001 125002 125003 125004 125005 125006 | #endif #endif {/* zName: */ "hard_heap_limit", /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) {/* zName: */ "ignore_check_constraints", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_IgnoreChecks }, |
124098 124099 124100 124101 124102 124103 124104 | /* ePragTyp: */ PragTyp_JOURNAL_MODE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, /* ColNames: */ 0, 0, /* iArg: */ 0 }, {/* zName: */ "journal_size_limit", /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, | < < < < < < < | 125042 125043 125044 125045 125046 125047 125048 125049 125050 125051 125052 125053 125054 125055 | /* ePragTyp: */ PragTyp_JOURNAL_MODE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, /* ColNames: */ 0, 0, /* iArg: */ 0 }, {/* zName: */ "journal_size_limit", /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "legacy_alter_table", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
124215 124216 124217 124218 124219 124220 124221 | /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ReadUncommit }, {/* zName: */ "recursive_triggers", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_RecTriggers }, | < < < < < < < < < | 125152 125153 125154 125155 125156 125157 125158 125159 125160 125161 125162 125163 125164 125165 | /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ReadUncommit }, {/* zName: */ "recursive_triggers", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_RecTriggers }, {/* zName: */ "reverse_unordered_selects", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ReverseOrder }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) |
124308 124309 124310 124311 124312 124313 124314 | /* iArg: */ 0 }, {/* zName: */ "temp_store_directory", /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif | < < < < < < < < < < < < | 125236 125237 125238 125239 125240 125241 125242 125243 125244 125245 125246 125247 125248 125249 | /* iArg: */ 0 }, {/* zName: */ "temp_store_directory", /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif {/* zName: */ "threads", /* ePragTyp: */ PragTyp_THREADS, /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "trusted_schema", |
124388 124389 124390 124391 124392 124393 124394 | {/* zName: */ "writable_schema", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; | | | 125304 125305 125306 125307 125308 125309 125310 125311 125312 125313 125314 125315 125316 125317 125318 | {/* zName: */ "writable_schema", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; /* Number of pragmas: 67 on by default, 77 total. */ /************** End of pragma.h **********************************************/ /************** Continuing where we left off in pragma.c *********************/ /* ** Interpret the given string as a safety level. Return 0 for OFF, ** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or |
124918 124919 124920 124921 124922 124923 124924 | int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; returnSingleInt(v, size); }else{ /* Malloc may fail when setting the page-size, as there is an internal ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = sqlite3Atoi(zRight); | | | 125834 125835 125836 125837 125838 125839 125840 125841 125842 125843 125844 125845 125846 125847 125848 | int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; returnSingleInt(v, size); }else{ /* Malloc may fail when setting the page-size, as there is an internal ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = sqlite3Atoi(zRight); if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,0,0) ){ sqlite3OomFault(db); } } break; } /* |
126092 126093 126094 126095 126096 126097 126098 | } sqlite3VdbeJumpHere(v, jmp4); sqlite3ResolvePartIdxLabel(pParse, jmp3); } } sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); | < < | 127008 127009 127010 127011 127012 127013 127014 127015 127016 127017 127018 127019 127020 127021 127022 127023 127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 | } sqlite3VdbeJumpHere(v, jmp4); sqlite3ResolvePartIdxLabel(pParse, jmp3); } } sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); if( !isQuick ){ sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ if( pPk==pIdx ) continue; sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); sqlite3VdbeLoadString(v, 4, pIdx->zName); sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); integrityCheckResultRow(v); sqlite3VdbeJumpHere(v, addr); } } } } { static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList endCode[] = { { OP_AddImm, 1, 0, 0}, /* 0 */ { OP_IfNotZero, 1, 4, 0}, /* 1 */ |
126187 126188 126189 126190 126191 126192 126193 | returnSingleText(v, encnames[ENC(pParse->db)].zName); }else{ /* "PRAGMA encoding = XXX" */ /* Only change the value of sqlite.enc if the database handle is not ** initialized. If the main database exists, the new sqlite.enc value ** will be overwritten when the schema is next loaded. If it does not ** already exists, it will be created to use the new encoding value. */ | | < < < < < < < < < < < | > > | 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113 127114 127115 127116 127117 127118 127119 127120 | returnSingleText(v, encnames[ENC(pParse->db)].zName); }else{ /* "PRAGMA encoding = XXX" */ /* Only change the value of sqlite.enc if the database handle is not ** initialized. If the main database exists, the new sqlite.enc value ** will be overwritten when the schema is next loaded. If it does not ** already exists, it will be created to use the new encoding value. */ if( (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ u8 enc = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; SCHEMA_ENC(db) = enc; sqlite3SetTextEncoding(db, enc); break; } } if( !pEnc->zName ){ sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); } } |
126549 126550 126551 126552 126553 126554 126555 126556 126557 126558 126559 126560 126561 126562 | && N>=0 ){ sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); } returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); break; } #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* ** Report the current state of file logs for all databases */ case PragTyp_LOCK_STATUS: { static const char *const azLockName[] = { | > > > > > > > > > > > > > > > > > > > | 127454 127455 127456 127457 127458 127459 127460 127461 127462 127463 127464 127465 127466 127467 127468 127469 127470 127471 127472 127473 127474 127475 127476 127477 127478 127479 127480 127481 127482 127483 127484 127485 127486 | && N>=0 ){ sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); } returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); break; } /* ** PRAGMA analysis_limit ** PRAGMA analysis_limit = N ** ** Configure the maximum number of rows that ANALYZE will examine ** in each index that it looks at. Return the new limit. */ case PragTyp_ANALYSIS_LIMIT: { sqlite3_int64 N; if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK && N>=0 ){ db->nAnalysisLimit = (int)(N&0x7fffffff); } returnSingleInt(v, db->nAnalysisLimit); break; } #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* ** Report the current state of file logs for all databases */ case PragTyp_LOCK_STATUS: { static const char *const azLockName[] = { |
126578 126579 126580 126581 126582 126583 126584 | } sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); } break; } #endif | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | 127502 127503 127504 127505 127506 127507 127508 127509 127510 127511 127512 127513 127514 127515 127516 127517 127518 127519 127520 | } sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); } break; } #endif #if defined(SQLITE_ENABLE_CEROD) case PragTyp_ACTIVATE_EXTENSIONS: if( zRight ){ if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ sqlite3_activate_cerod(&zRight[6]); } } break; #endif } /* End of the PRAGMA switch */ /* The following block is a no-op unless SQLITE_DEBUG is defined. Its only |
127058 127059 127060 127061 127062 127063 127064 | InitData *pData = (InitData*)pInit; sqlite3 *db = pData->db; int iDb = pData->iDb; assert( argc==5 ); UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); | | | 127934 127935 127936 127937 127938 127939 127940 127941 127942 127943 127944 127945 127946 127947 127948 | InitData *pData = (InitData*)pInit; sqlite3 *db = pData->db; int iDb = pData->iDb; assert( argc==5 ); UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); db->mDbFlags |= DBFLAG_EncodingFixed; pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[1], 0); return 1; } assert( iDb>=0 && iDb<db->nDb ); |
127146 127147 127148 127149 127150 127151 127152 127153 127154 127155 127156 127157 127158 127159 | #endif Db *pDb; char const *azArg[6]; int meta[5]; InitData initData; const char *zMasterName; int openedTransaction = 0; assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ); assert( iDb>=0 && iDb<db->nDb ); assert( db->aDb[iDb].pSchema ); assert( sqlite3_mutex_held(db->mutex) ); assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); | > | 128022 128023 128024 128025 128026 128027 128028 128029 128030 128031 128032 128033 128034 128035 128036 | #endif Db *pDb; char const *azArg[6]; int meta[5]; InitData initData; const char *zMasterName; int openedTransaction = 0; int mask = ((db->mDbFlags & DBFLAG_EncodingFixed) | ~DBFLAG_EncodingFixed); assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ); assert( iDb>=0 && iDb<db->nDb ); assert( db->aDb[iDb].pSchema ); assert( sqlite3_mutex_held(db->mutex) ); assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); |
127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127184 127185 127186 127187 | initData.db = db; initData.iDb = iDb; initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; initData.nInitRow = 0; sqlite3InitCallback(&initData, 5, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; goto error_out; } /* Create a cursor to hold the database open */ | > | 128051 128052 128053 128054 128055 128056 128057 128058 128059 128060 128061 128062 128063 128064 128065 | initData.db = db; initData.iDb = iDb; initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; initData.nInitRow = 0; sqlite3InitCallback(&initData, 5, (char **)azArg, 0); db->mDbFlags &= mask; if( initData.rc ){ rc = initData.rc; goto error_out; } /* Create a cursor to hold the database open */ |
127233 127234 127235 127236 127237 127238 127239 | /* If opening a non-empty database, check the text encoding. For the ** main database, set sqlite3.enc to the encoding of the main database. ** For an attached db, it is an error if the encoding is not the same ** as sqlite3.enc. */ if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ | | < > < | > | < < | 128111 128112 128113 128114 128115 128116 128117 128118 128119 128120 128121 128122 128123 128124 128125 128126 128127 128128 128129 128130 128131 128132 128133 128134 128135 128136 128137 128138 128139 128140 128141 128142 128143 | /* If opening a non-empty database, check the text encoding. For the ** main database, set sqlite3.enc to the encoding of the main database. ** For an attached db, it is an error if the encoding is not the same ** as sqlite3.enc. */ if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ if( iDb==0 && (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ u8 encoding; #ifndef SQLITE_OMIT_UTF16 /* If opening the main database, set ENC(db). */ encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3; if( encoding==0 ) encoding = SQLITE_UTF8; #else encoding = SQLITE_UTF8; #endif sqlite3SetTextEncoding(db, encoding); }else{ /* If opening an attached database, the encoding much match ENC(db) */ if( (meta[BTREE_TEXT_ENCODING-1] & 3)!=ENC(db) ){ sqlite3SetString(pzErrMsg, db, "attached databases must use the same" " text encoding as main database"); rc = SQLITE_ERROR; goto initone_error_out; } } } pDb->pSchema->enc = ENC(db); if( pDb->pSchema->cache_size==0 ){ #ifndef SQLITE_OMIT_DEPRECATED size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } |
127365 127366 127367 127368 127369 127370 127371 | /* ** Initialize all database files - the main database file, the file ** used to store temporary tables, and any additional database files ** created using ATTACH statements. Return a success code. If an ** error occurs, write an error message into *pzErrMsg. ** ** After a database is initialized, the DB_SchemaLoaded bit is set | | < | 128241 128242 128243 128244 128245 128246 128247 128248 128249 128250 128251 128252 128253 128254 128255 | /* ** Initialize all database files - the main database file, the file ** used to store temporary tables, and any additional database files ** created using ATTACH statements. Return a success code. If an ** error occurs, write an error message into *pzErrMsg. ** ** After a database is initialized, the DB_SchemaLoaded bit is set ** bit is set in the flags field of the Db structure. */ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ int i, rc; int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); assert( sqlite3_mutex_held(db->mutex) ); assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); |
128002 128003 128004 128005 128006 128007 128008 | sqlite3ExprDelete(db, p->pHaving); sqlite3ExprListDelete(db, p->pOrderBy); sqlite3ExprDelete(db, p->pLimit); #ifndef SQLITE_OMIT_WINDOWFUNC if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ sqlite3WindowListDelete(db, p->pWinDefn); } | < | 128877 128878 128879 128880 128881 128882 128883 128884 128885 128886 128887 128888 128889 128890 | sqlite3ExprDelete(db, p->pHaving); sqlite3ExprListDelete(db, p->pOrderBy); sqlite3ExprDelete(db, p->pLimit); #ifndef SQLITE_OMIT_WINDOWFUNC if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ sqlite3WindowListDelete(db, p->pWinDefn); } #endif if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); if( bFree ) sqlite3DbFreeNN(db, p); p = pPrior; bFree = 1; } } |
129923 129924 129925 129926 129927 129928 129929 129930 129931 129932 129933 129934 129935 129936 | for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} if( zName[j]==':' ) nName = j; } zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); } pCol->zName = zName; sqlite3ColumnPropertiesFromName(0, pCol); if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ sqlite3OomFault(db); } } sqlite3HashClear(&ht); if( db->mallocFailed ){ | > | 130797 130798 130799 130800 130801 130802 130803 130804 130805 130806 130807 130808 130809 130810 130811 | for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} if( zName[j]==':' ) nName = j; } zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); } pCol->zName = zName; pCol->hName = sqlite3StrIHash(zName); sqlite3ColumnPropertiesFromName(0, pCol); if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ sqlite3OomFault(db); } } sqlite3HashClear(&ht); if( db->mallocFailed ){ |
130705 130706 130707 130708 130709 130710 130711 130712 130713 130714 130715 130716 130717 130718 | } sqlite3ExprDelete(db, p->pLimit); p->pLimit = pLimit; /* Generate code to take the intersection of the two temporary ** tables. */ assert( p->pEList ); iBreak = sqlite3VdbeMakeLabel(pParse); iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); | > | 131580 131581 131582 131583 131584 131585 131586 131587 131588 131589 131590 131591 131592 131593 131594 | } sqlite3ExprDelete(db, p->pLimit); p->pLimit = pLimit; /* Generate code to take the intersection of the two temporary ** tables. */ if( rc ) break; assert( p->pEList ); iBreak = sqlite3VdbeMakeLabel(pParse); iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); |
131396 131397 131398 131399 131400 131401 131402 131403 131404 131405 131406 131407 131408 131409 | }else{ sqlite3 *db = pSubst->pParse->db; if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ memset(&ifNullRow, 0, sizeof(ifNullRow)); ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } | > | 132272 132273 132274 132275 132276 132277 132278 132279 132280 132281 132282 132283 132284 132285 132286 | }else{ sqlite3 *db = pSubst->pParse->db; if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ memset(&ifNullRow, 0, sizeof(ifNullRow)); ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; ifNullRow.iTable = pSubst->iNewTable; ifNullRow.flags = EP_Skip; pCopy = &ifNullRow; } testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } |
131479 131480 131481 131482 131483 131484 131485 131486 131487 131488 131489 131490 131491 131492 | for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ substSelect(pSubst, pItem->pSelect, 1); if( pItem->fg.isTabFunc ){ substExprList(pSubst, pItem->u1.pFuncArg); } } }while( doPrior && (p = p->pPrior)!=0 ); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* ** This routine attempts to flatten subqueries as a performance optimization. ** This routine returns 1 if it makes changes and 0 if no flattening occurs. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 132356 132357 132358 132359 132360 132361 132362 132363 132364 132365 132366 132367 132368 132369 132370 132371 132372 132373 132374 132375 132376 132377 132378 132379 132380 132381 132382 132383 132384 132385 132386 132387 132388 132389 132390 132391 132392 132393 132394 132395 132396 132397 132398 132399 132400 132401 | for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ substSelect(pSubst, pItem->pSelect, 1); if( pItem->fg.isTabFunc ){ substExprList(pSubst, pItem->u1.pFuncArg); } } }while( doPrior && (p = p->pPrior)!=0 ); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* ** pSelect is a SELECT statement and pSrcItem is one item in the FROM ** clause of that SELECT. ** ** This routine scans the entire SELECT statement and recomputes the ** pSrcItem->colUsed mask. */ static int recomputeColumnsUsedExpr(Walker *pWalker, Expr *pExpr){ struct SrcList_item *pItem; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; pItem = pWalker->u.pSrcItem; if( pItem->iCursor!=pExpr->iTable ) return WRC_Continue; if( pExpr->iColumn<0 ) return WRC_Continue; pItem->colUsed |= sqlite3ExprColUsed(pExpr); return WRC_Continue; } static void recomputeColumnsUsed( Select *pSelect, /* The complete SELECT statement */ struct SrcList_item *pSrcItem /* Which FROM clause item to recompute */ ){ Walker w; if( NEVER(pSrcItem->pTab==0) ) return; memset(&w, 0, sizeof(w)); w.xExprCallback = recomputeColumnsUsedExpr; w.xSelectCallback = sqlite3SelectWalkNoop; w.u.pSrcItem = pSrcItem; pSrcItem->colUsed = 0; sqlite3WalkSelect(&w, pSelect); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* ** This routine attempts to flatten subqueries as a performance optimization. ** This routine returns 1 if it makes changes and 0 if no flattening occurs. |
132020 132021 132022 132023 132024 132025 132026 132027 132028 132029 132030 132031 132032 132033 | ** One is tempted to try to add a and b to combine the limits. But this ** does not work if either limit is negative. */ if( pSub->pLimit ){ pParent->pLimit = pSub->pLimit; pSub->pLimit = 0; } } /* Finially, delete what is left of the subquery and return ** success. */ sqlite3SelectDelete(db, pSub1); | > > > > > > | 132929 132930 132931 132932 132933 132934 132935 132936 132937 132938 132939 132940 132941 132942 132943 132944 132945 132946 132947 132948 | ** One is tempted to try to add a and b to combine the limits. But this ** does not work if either limit is negative. */ if( pSub->pLimit ){ pParent->pLimit = pSub->pLimit; pSub->pLimit = 0; } /* Recompute the SrcList_item.colUsed masks for the flattened ** tables. */ for(i=0; i<nSubSrc; i++){ recomputeColumnsUsed(pParent, &pSrc->a[i+iFrom]); } } /* Finially, delete what is left of the subquery and return ** success. */ sqlite3SelectDelete(db, pSub1); |
132068 132069 132070 132071 132072 132073 132074 | Expr *pValue, /* The VALUE part of the constraint */ Expr *pExpr /* Overall expression: COLUMN=VALUE or VALUE=COLUMN */ ){ int i; assert( pColumn->op==TK_COLUMN ); assert( sqlite3ExprIsConstant(pValue) ); | | | < | 132983 132984 132985 132986 132987 132988 132989 132990 132991 132992 132993 132994 132995 132996 132997 132998 | Expr *pValue, /* The VALUE part of the constraint */ Expr *pExpr /* Overall expression: COLUMN=VALUE or VALUE=COLUMN */ ){ int i; assert( pColumn->op==TK_COLUMN ); assert( sqlite3ExprIsConstant(pValue) ); if( ExprHasProperty(pColumn, EP_FixedCol) ) return; if( sqlite3ExprAffinity(pValue)!=0 ) return; if( !sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ return; } /* 2018-10-25 ticket [cf5ed20f] ** Make sure the same pColumn is not inserted more than once */ for(i=0; i<pConst->nConst; i++){ |
132093 132094 132095 132096 132097 132098 132099 | pConst->nConst++; pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, pConst->nConst*2*sizeof(Expr*)); if( pConst->apExpr==0 ){ pConst->nConst = 0; }else{ | < < < | 133007 133008 133009 133010 133011 133012 133013 133014 133015 133016 133017 133018 133019 133020 | pConst->nConst++; pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, pConst->nConst*2*sizeof(Expr*)); if( pConst->apExpr==0 ){ pConst->nConst = 0; }else{ pConst->apExpr[pConst->nConst*2-2] = pColumn; pConst->apExpr[pConst->nConst*2-1] = pValue; } } /* ** Find all terms of COLUMN=VALUE or VALUE=COLUMN in pExpr where VALUE |
132371 132372 132373 132374 132375 132376 132377 | ** analysis. */ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ const char *zFunc; /* Name of aggregate function pFunc */ ExprList *pOrderBy; | | > | > | 133282 133283 133284 133285 133286 133287 133288 133289 133290 133291 133292 133293 133294 133295 133296 133297 133298 133299 133300 133301 133302 133303 133304 133305 133306 133307 133308 133309 | ** analysis. */ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ const char *zFunc; /* Name of aggregate function pFunc */ ExprList *pOrderBy; u8 sortFlags = 0; assert( *ppMinMax==0 ); assert( pFunc->op==TK_AGG_FUNCTION ); assert( !IsWindowFunc(pFunc) ); if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){ return eRet; } zFunc = pFunc->u.zToken; if( sqlite3StrICmp(zFunc, "min")==0 ){ eRet = WHERE_ORDERBY_MIN; if( sqlite3ExprCanBeNull(pEList->a[0].pExpr) ){ sortFlags = KEYINFO_ORDER_BIGNULL; } }else if( sqlite3StrICmp(zFunc, "max")==0 ){ eRet = WHERE_ORDERBY_MAX; sortFlags = KEYINFO_ORDER_DESC; }else{ return eRet; } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); |
133050 133051 133052 133053 133054 133055 133056 | } }else{ pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); sqlite3TokenInit(&sColname, zColname); sqlite3ExprListSetName(pParse, pNew, &sColname, 0); | | | 133963 133964 133965 133966 133967 133968 133969 133970 133971 133972 133973 133974 133975 133976 133977 | } }else{ pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); sqlite3TokenInit(&sColname, zColname); sqlite3ExprListSetName(pParse, pNew, &sColname, 0); if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; sqlite3DbFree(db, pX->zEName); if( pSub ){ pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); testcase( pX->zEName==0 ); }else{ pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", |
133396 133397 133398 133399 133400 133401 133402 | } for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){ sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); } pAggInfo->directMode = 0; if( addrHitTest ){ | | | 134309 134310 134311 134312 134313 134314 134315 134316 134317 134318 134319 134320 134321 134322 134323 | } for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){ sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); } pAggInfo->directMode = 0; if( addrHitTest ){ sqlite3VdbeJumpHereOrPopInst(v, addrHitTest); } } /* ** Add a single OP_Explain instruction to the VDBE to explain a simple ** count(*) query ("SELECT count(*) FROM pTab"). */ |
134524 134525 134526 134527 134528 134529 134530 | resetAccumulator(pParse, &sAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { | < | 135437 135438 135439 135440 135441 135442 135443 135444 135445 135446 135447 135448 135449 135450 | resetAccumulator(pParse, &sAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { Table *pTab; if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ /* If isSimpleCount() returns a pointer to a Table structure, then ** the SQL statement is of the form: ** ** SELECT count(*) FROM <tbl> ** |
134560 134561 134562 134563 134564 134565 134566 | ** ** (2013-10-03) Do not count the entries in a partial index. ** ** In practice the KeyInfo structure will not be used. It is only ** passed to keep OP_OpenRead happy. */ if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); | > | | | | | | | > | < < | 135472 135473 135474 135475 135476 135477 135478 135479 135480 135481 135482 135483 135484 135485 135486 135487 135488 135489 135490 135491 135492 135493 135494 135495 135496 135497 135498 135499 135500 135501 135502 135503 135504 135505 135506 135507 135508 135509 135510 | ** ** (2013-10-03) Do not count the entries in a partial index. ** ** In practice the KeyInfo structure will not be used. It is only ** passed to keep OP_OpenRead happy. */ if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); if( !p->pSrc->a[0].fg.notIndexed ){ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ if( pIdx->bUnordered==0 && pIdx->szIdxRow<pTab->szTabRow && pIdx->pPartIdxWhere==0 && (!pBest || pIdx->szIdxRow<pBest->szIdxRow) ){ pBest = pIdx; } } } if( pBest ){ iRoot = pBest->tnum; pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pBest); } /* Open a read-only cursor, execute the OP_Count, close the cursor. */ sqlite3VdbeAddOp4Int(v, OP_OpenRead, iCsr, iRoot, iDb, 1); if( pKeyInfo ){ sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); } sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); sqlite3VdbeAddOp1(v, OP_Close, iCsr); explainSimpleCount(pParse, pTab, pBest); }else{ int regAcc = 0; /* "populate accumulators" flag */ /* If there are accumulator registers but no min() or max() functions ** without FILTER clauses, allocate register regAcc. Register regAcc ** will contain 0 the first time the inner loop runs, and 1 thereafter. ** The code generated by updateAccumulator() uses this to ensure ** that the accumulator registers are (a) updated only once if |
134747 134748 134749 134750 134751 134752 134753 | need = nCol*2; }else{ need = nCol; } if( p->nData + need > p->nAlloc ){ char **azNew; p->nAlloc = p->nAlloc*2 + need; | | | 135659 135660 135661 135662 135663 135664 135665 135666 135667 135668 135669 135670 135671 135672 135673 | need = nCol*2; }else{ need = nCol; } if( p->nData + need > p->nAlloc ){ char **azNew; p->nAlloc = p->nAlloc*2 + need; azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc ); if( azNew==0 ) goto malloc_failed; p->azResult = azNew; } /* If this is the first row, then generate an extra row containing ** the names of all columns. */ |
134856 134857 134858 134859 134860 134861 134862 | sqlite3_free(res.zErrMsg); if( rc!=SQLITE_OK ){ sqlite3_free_table(&res.azResult[1]); return rc; } if( res.nAlloc>res.nData ){ char **azNew; | | | 135768 135769 135770 135771 135772 135773 135774 135775 135776 135777 135778 135779 135780 135781 135782 | sqlite3_free(res.zErrMsg); if( rc!=SQLITE_OK ){ sqlite3_free_table(&res.azResult[1]); return rc; } if( res.nAlloc>res.nData ){ char **azNew; azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData ); if( azNew==0 ){ sqlite3_free_table(&res.azResult[1]); db->errCode = SQLITE_NOMEM; return SQLITE_NOMEM_BKPT; } res.azResult = azNew; } |
135472 135473 135474 135475 135476 135477 135478 | assert( pName->nSrc==1 ); zDb = pName->a[0].zDatabase; zName = pName->a[0].zName; assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ | | | 136384 136385 136386 136387 136388 136389 136390 136391 136392 136393 136394 136395 136396 136397 136398 | assert( pName->nSrc==1 ); zDb = pName->a[0].zDatabase; zName = pName->a[0].zName; assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; assert( sqlite3SchemaMutexHeld(db, j, 0) ); pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); if( pTrigger ) break; } if( !pTrigger ){ if( !noErr ){ sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0); |
136146 136147 136148 136149 136150 136151 136152 | ** into the sqlite_master table.) ** ** Therefore, the P4 parameter is only required if the default value for ** the column is a literal number, string or null. The sqlite3ValueFromExpr() ** function is capable of transforming these types of expressions into ** sqlite3_value objects. ** | > > | < < | | | 137058 137059 137060 137061 137062 137063 137064 137065 137066 137067 137068 137069 137070 137071 137072 137073 137074 137075 137076 137077 137078 137079 137080 137081 137082 137083 137084 137085 137086 137087 137088 137089 137090 137091 137092 | ** into the sqlite_master table.) ** ** Therefore, the P4 parameter is only required if the default value for ** the column is a literal number, string or null. The sqlite3ValueFromExpr() ** function is capable of transforming these types of expressions into ** sqlite3_value objects. ** ** If column as REAL affinity and the table is an ordinary b-tree table ** (not a virtual table) then the value might have been stored as an ** integer. In that case, add an OP_RealAffinity opcode to make sure ** it has been converted into REAL. */ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ assert( pTab!=0 ); if( !pTab->pSelect ){ sqlite3_value *pValue = 0; u8 enc = ENC(sqlite3VdbeDb(v)); Column *pCol = &pTab->aCol[i]; VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); assert( i<pTab->nCol ); sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, pCol->affinity, &pValue); if( pValue ){ sqlite3VdbeAppendP4(v, pValue, P4_MEM); } } #ifndef SQLITE_OMIT_FLOATING_POINT if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); } #endif } /* ** Check to see if column iCol of index pIdx references any of the |
136709 136710 136711 136712 136713 136714 136715 | } if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen, 0, 0); | | > > | 137621 137622 137623 137624 137625 137626 137627 137628 137629 137630 137631 137632 137633 137634 137635 137636 137637 | } if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen, 0, 0); if( addrOnce ){ sqlite3VdbeJumpHereOrPopInst(v, addrOnce); } } /* Top of the update loop */ if( eOnePass!=ONEPASS_OFF ){ if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){ assert( pPk ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); |
137662 137663 137664 137665 137666 137667 137668 | if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ rc = SQLITE_ERROR; sqlite3SetString(pzErrMsg, db, "output file already exists"); goto end_of_vacuum; } db->mDbFlags |= DBFLAG_VacuumInto; } | | < < < < < < < < < < < | 138576 138577 138578 138579 138580 138581 138582 138583 138584 138585 138586 138587 138588 138589 138590 | if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ rc = SQLITE_ERROR; sqlite3SetString(pzErrMsg, db, "output file already exists"); goto end_of_vacuum; } db->mDbFlags |= DBFLAG_VacuumInto; } nRes = sqlite3BtreeGetRequestedReserve(pMain); sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); /* Begin a transaction and take an exclusive lock on the main database ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below, |
137817 137818 137819 137820 137821 137822 137823 | /* Restore the original value of db->flags */ db->init.iDb = 0; db->mDbFlags = saved_mDbFlags; db->flags = saved_flags; db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; db->mTrace = saved_mTrace; | | | 138720 138721 138722 138723 138724 138725 138726 138727 138728 138729 138730 138731 138732 138733 138734 | /* Restore the original value of db->flags */ db->init.iDb = 0; db->mDbFlags = saved_mDbFlags; db->flags = saved_flags; db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; db->mTrace = saved_mTrace; sqlite3BtreeSetPageSize(pMain, -1, 0, 1); /* Currently there is an SQL level transaction open on the vacuum ** database. No locks are held on any other files (since the main file ** was committed at the btree level). So it safe to end the transaction ** by manually setting the autoCommit flag to true and detaching the ** vacuum database. The vacuum_db journal file is deleted when the pager ** is closed by the DETACH. |
139024 139025 139026 139027 139028 139029 139030 | Table **apVtabLock; assert( IsVirtual(pTab) ); for(i=0; i<pToplevel->nVtabLock; i++){ if( pTab==pToplevel->apVtabLock[i] ) return; } n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); | | | 139927 139928 139929 139930 139931 139932 139933 139934 139935 139936 139937 139938 139939 139940 139941 | Table **apVtabLock; assert( IsVirtual(pTab) ); for(i=0; i<pToplevel->nVtabLock; i++){ if( pTab==pToplevel->apVtabLock[i] ) return; } n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n); if( apVtabLock ){ pToplevel->apVtabLock = apVtabLock; pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; }else{ sqlite3OomFault(pToplevel->db); } } |
139481 139482 139483 139484 139485 139486 139487 139488 139489 139490 139491 139492 139493 139494 | # define TERM_VNULL 0x0000 /* Disabled if not using stat4 */ #endif #define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ #define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ #define TERM_LIKE 0x0400 /* The original LIKE operator */ #define TERM_IS 0x0800 /* Term.pExpr is an IS operator */ #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ /* ** An instance of the WhereScan object is used as an iterator for locating ** terms in the WHERE clause that are useful to the query planner. */ struct WhereScan { WhereClause *pOrigWC; /* Original, innermost WhereClause */ | > > > > > > | 140384 140385 140386 140387 140388 140389 140390 140391 140392 140393 140394 140395 140396 140397 140398 140399 140400 140401 140402 140403 | # define TERM_VNULL 0x0000 /* Disabled if not using stat4 */ #endif #define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ #define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ #define TERM_LIKE 0x0400 /* The original LIKE operator */ #define TERM_IS 0x0800 /* Term.pExpr is an IS operator */ #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ #define TERM_HEURTRUTH 0x2000 /* Heuristic truthProb used */ #ifdef SQLITE_ENABLE_STAT4 # define TERM_HIGHTRUTH 0x4000 /* Term excludes few rows */ #else # define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ #endif /* ** An instance of the WhereScan object is used as an iterator for locating ** terms in the WHERE clause that are useful to the query planner. */ struct WhereScan { WhereClause *pOrigWC; /* Original, innermost WhereClause */ |
139595 139596 139597 139598 139599 139600 139601 | ExprList *pOrderBy; /* ORDER BY clause */ WhereLoop *pNew; /* Template WhereLoop */ WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ #ifdef SQLITE_ENABLE_STAT4 UnpackedRecord *pRec; /* Probe for stat4 (if required) */ int nRecValid; /* Number of valid fields currently in pRec */ #endif | | > | | > > | 140504 140505 140506 140507 140508 140509 140510 140511 140512 140513 140514 140515 140516 140517 140518 140519 140520 140521 140522 140523 140524 140525 140526 140527 | ExprList *pOrderBy; /* ORDER BY clause */ WhereLoop *pNew; /* Template WhereLoop */ WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ #ifdef SQLITE_ENABLE_STAT4 UnpackedRecord *pRec; /* Probe for stat4 (if required) */ int nRecValid; /* Number of valid fields currently in pRec */ #endif unsigned char bldFlags1; /* First set of SQLITE_BLDF_* flags */ unsigned char bldFlags2; /* Second set of SQLITE_BLDF_* flags */ unsigned int iPlanLimit; /* Search limiter */ }; /* Allowed values for WhereLoopBuider.bldFlags */ #define SQLITE_BLDF1_INDEXED 0x0001 /* An index is used */ #define SQLITE_BLDF1_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ #define SQLITE_BLDF2_2NDPASS 0x0004 /* Second builder pass needed */ /* The WhereLoopBuilder.iPlanLimit is used to limit the number of ** index+constraint combinations the query planner will consider for a ** particular query. If this parameter is unlimited, then certain ** pathological queries can spend excess time in the sqlite3WhereBegin() ** routine. The limit is high enough that is should not impact real-world ** queries. |
141215 141216 141217 141218 141219 141220 141221 | pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); assert( pCompare!=0 || db->mallocFailed ); if( pCompare ){ pCompare->pLeft = pTerm->pExpr->pLeft; pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); if( pRight ){ pRight->iTable = iReg+j+2; | | > > | 142127 142128 142129 142130 142131 142132 142133 142134 142135 142136 142137 142138 142139 142140 142141 142142 142143 | pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); assert( pCompare!=0 || db->mallocFailed ); if( pCompare ){ pCompare->pLeft = pTerm->pExpr->pLeft; pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); if( pRight ){ pRight->iTable = iReg+j+2; sqlite3ExprIfFalse( pParse, pCompare, pLevel->addrCont, SQLITE_JUMPIFNULL ); } pCompare->pLeft = 0; sqlite3ExprDelete(db, pCompare); } } } assert( iIn==0 || db->mallocFailed ); |
141492 141493 141494 141495 141496 141497 141498 141499 141500 141501 141502 141503 141504 141505 | ){ assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); assert( pRangeEnd==0 && pRangeStart==0 ); testcase( pLoop->nSkip>0 ); nExtraReg = 1; bSeekPastNull = 1; pLevel->regBignull = regBignull = ++pParse->nMem; pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); } /* If we are doing a reverse order scan on an ascending index, or ** a forward order scan on a descending index, interchange the ** start and end terms (pRangeStart and pRangeEnd). */ | > > > | 142406 142407 142408 142409 142410 142411 142412 142413 142414 142415 142416 142417 142418 142419 142420 142421 142422 | ){ assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); assert( pRangeEnd==0 && pRangeStart==0 ); testcase( pLoop->nSkip>0 ); nExtraReg = 1; bSeekPastNull = 1; pLevel->regBignull = regBignull = ++pParse->nMem; if( pLevel->iLeftJoin ){ sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); } pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); } /* If we are doing a reverse order scan on an ascending index, or ** a forward order scan on a descending index, interchange the ** start and end terms (pRangeStart and pRangeEnd). */ |
142629 142630 142631 142632 142633 142634 142635 | ** virtual table on their second argument, which is the same as ** the left-hand side operand in their in-fix form. ** ** vtab_column MATCH expression ** MATCH(expression,vtab_column) */ pCol = pList->a[1].pExpr; | | > | 143546 143547 143548 143549 143550 143551 143552 143553 143554 143555 143556 143557 143558 143559 143560 143561 | ** virtual table on their second argument, which is the same as ** the left-hand side operand in their in-fix form. ** ** vtab_column MATCH expression ** MATCH(expression,vtab_column) */ pCol = pList->a[1].pExpr; testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); if( ExprIsVtab(pCol) ){ for(i=0; i<ArraySize(aOp); i++){ if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){ *peOp2 = aOp[i].eOp2; *ppRight = pList->a[0].pExpr; *ppLeft = pCol; return 1; } |
142651 142652 142653 142654 142655 142656 142657 | ** OVERLOADED(vtab_column,expression) ** ** Historically, xFindFunction expected to see lower-case function ** names. But for this use case, xFindFunction is expected to deal ** with function names in an arbitrary case. */ pCol = pList->a[0].pExpr; | | > | 143569 143570 143571 143572 143573 143574 143575 143576 143577 143578 143579 143580 143581 143582 143583 143584 | ** OVERLOADED(vtab_column,expression) ** ** Historically, xFindFunction expected to see lower-case function ** names. But for this use case, xFindFunction is expected to deal ** with function names in an arbitrary case. */ pCol = pList->a[0].pExpr; testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); if( ExprIsVtab(pCol) ){ sqlite3_vtab *pVtab; sqlite3_module *pMod; void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); void *pNotUsed; pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); |
142674 142675 142676 142677 142678 142679 142680 | } } } }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ int res = 0; Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; | | > | > | 143593 143594 143595 143596 143597 143598 143599 143600 143601 143602 143603 143604 143605 143606 143607 143608 143609 143610 143611 143612 | } } } }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ int res = 0; Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); if( ExprIsVtab(pLeft) ){ res++; } testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); if( pRight && ExprIsVtab(pRight) ){ res++; SWAP(Expr*, pLeft, pRight); } *ppLeft = pLeft; *ppRight = pRight; if( pExpr->op==TK_NE ) *peOp2 = SQLITE_INDEX_CONSTRAINT_NE; if( pExpr->op==TK_ISNOT ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOT; |
146161 146162 146163 146164 146165 146166 146167 | /* If a truth probability is specified using the likelihood() hints, ** then use the probability provided by the application. */ pLoop->nOut += pTerm->truthProb; }else{ /* In the absence of explicit truth probabilities, use heuristics to ** guess a reasonable truth probability. */ pLoop->nOut--; | | > > | > > > | 147082 147083 147084 147085 147086 147087 147088 147089 147090 147091 147092 147093 147094 147095 147096 147097 147098 147099 147100 147101 147102 147103 147104 147105 147106 147107 147108 147109 147110 | /* If a truth probability is specified using the likelihood() hints, ** then use the probability provided by the application. */ pLoop->nOut += pTerm->truthProb; }else{ /* In the absence of explicit truth probabilities, use heuristics to ** guess a reasonable truth probability. */ pLoop->nOut--; if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && (pTerm->wtFlags & TERM_HIGHTRUTH)==0 /* tag-20200224-1 */ ){ Expr *pRight = pTerm->pExpr->pRight; int k = 0; testcase( pTerm->pExpr->op==TK_IS ); if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ k = 10; }else{ k = 20; } if( iReduce<k ){ pTerm->wtFlags |= TERM_HEURTRUTH; iReduce = k; } } } } } if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; } |
146352 146353 146354 146355 146356 146357 146358 | if( (pSrc->fg.jointype & JT_LEFT)!=0 && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) ){ continue; } if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ | | | | 147278 147279 147280 147281 147282 147283 147284 147285 147286 147287 147288 147289 147290 147291 147292 147293 147294 | if( (pSrc->fg.jointype & JT_LEFT)!=0 && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) ){ continue; } if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE; }else{ pBuilder->bldFlags1 |= SQLITE_BLDF1_INDEXED; } pNew->wsFlags = saved_wsFlags; pNew->u.btree.nEq = saved_nEq; pNew->u.btree.nBtm = saved_nBtm; pNew->u.btree.nTop = saved_nTop; pNew->nLTerm = saved_nLTerm; if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ |
146519 146520 146521 146522 146523 146524 146525 146526 146527 146528 146529 146530 146531 146532 | }else{ rc = whereInScanEst(pParse, pBuilder, pExpr->x.pList, &nOut); } if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; if( rc!=SQLITE_OK ) break; /* Jump out of the pTerm loop */ if( nOut ){ pNew->nOut = sqlite3LogEst(nOut); if( pNew->nOut>saved_nOut ) pNew->nOut = saved_nOut; pNew->nOut -= nIn; } } if( nOut==0 ) #endif { | > > > > > > > > > > > > > > > > > > > > > | 147445 147446 147447 147448 147449 147450 147451 147452 147453 147454 147455 147456 147457 147458 147459 147460 147461 147462 147463 147464 147465 147466 147467 147468 147469 147470 147471 147472 147473 147474 147475 147476 147477 147478 147479 | }else{ rc = whereInScanEst(pParse, pBuilder, pExpr->x.pList, &nOut); } if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; if( rc!=SQLITE_OK ) break; /* Jump out of the pTerm loop */ if( nOut ){ pNew->nOut = sqlite3LogEst(nOut); if( nEq==1 /* TUNING: Mark terms as "low selectivity" if they seem likely ** to be true for half or more of the rows in the table. ** See tag-202002240-1 */ && pNew->nOut+10 > pProbe->aiRowLogEst[0] ){ #if WHERETRACE_ENABLED /* 0x01 */ if( sqlite3WhereTrace & 0x01 ){ sqlite3DebugPrintf( "STAT4 determines term has low selectivity:\n"); sqlite3WhereTermPrint(pTerm, 999); } #endif pTerm->wtFlags |= TERM_HIGHTRUTH; if( pTerm->wtFlags & TERM_HEURTRUTH ){ /* If the term has previously been used with an assumption of ** higher selectivity, then set the flag to rerun the ** loop computations. */ pBuilder->bldFlags2 |= SQLITE_BLDF2_2NDPASS; } } if( pNew->nOut>saved_nOut ) pNew->nOut = saved_nOut; pNew->nOut -= nIn; } } if( nOut==0 ) #endif { |
146595 146596 146597 146598 146599 146600 146601 146602 146603 146604 146605 146606 146607 146608 | ** On the other hand, the extra seeks could end up being significantly ** more expensive. */ assert( 42==sqlite3LogEst(18) ); if( saved_nEq==saved_nSkip && saved_nEq+1<pProbe->nKeyCol && saved_nEq==pNew->nLTerm && pProbe->noSkipScan==0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; pNew->u.btree.nEq++; pNew->nSkip++; | > | 147542 147543 147544 147545 147546 147547 147548 147549 147550 147551 147552 147553 147554 147555 147556 | ** On the other hand, the extra seeks could end up being significantly ** more expensive. */ assert( 42==sqlite3LogEst(18) ); if( saved_nEq==saved_nSkip && saved_nEq+1<pProbe->nKeyCol && saved_nEq==pNew->nLTerm && pProbe->noSkipScan==0 && pProbe->hasStat1!=0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; pNew->u.btree.nEq++; pNew->nSkip++; |
146942 146943 146944 146945 146946 146947 146948 | whereLoopOutputAdjust(pWC, pNew, rSize); rc = whereLoopInsert(pBuilder, pNew); pNew->nOut = rSize; if( rc ) break; } } | | | | 147890 147891 147892 147893 147894 147895 147896 147897 147898 147899 147900 147901 147902 147903 147904 147905 147906 | whereLoopOutputAdjust(pWC, pNew, rSize); rc = whereLoopInsert(pBuilder, pNew); pNew->nOut = rSize; if( rc ) break; } } pBuilder->bldFlags1 = 0; rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); if( pBuilder->bldFlags1==SQLITE_BLDF1_INDEXED ){ /* If a non-unique index is used, or if a prefix of the key for ** unique index is used (making the index functionally non-unique) ** then the sqlite_stat1 data becomes important for scoring the ** plan */ pTab->tabFlags |= TF_StatsUsed; } #ifdef SQLITE_ENABLE_STAT4 |
147615 147616 147617 147618 147619 147620 147621 | ** optimization, and then only if they are actually used ** by the query plan */ assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); for(j=0; j<pLoop->nLTerm && pTerm!=pLoop->aLTerm[j]; j++){} if( j>=pLoop->nLTerm ) continue; } if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ | | | > > > | 148563 148564 148565 148566 148567 148568 148569 148570 148571 148572 148573 148574 148575 148576 148577 148578 148579 148580 148581 | ** optimization, and then only if they are actually used ** by the query plan */ assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); for(j=0; j<pLoop->nLTerm && pTerm!=pLoop->aLTerm[j]; j++){} if( j>=pLoop->nLTerm ) continue; } if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ Parse *pParse = pWInfo->pParse; CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pOrderBy->a[i].pExpr); CollSeq *pColl2 = sqlite3ExprCompareCollSeq(pParse, pTerm->pExpr); assert( pColl1 ); if( pColl2==0 || sqlite3StrICmp(pColl1->zName, pColl2->zName) ){ continue; } testcase( pTerm->pExpr->op==TK_IS ); } obSat |= MASKBIT(i); } |
148396 148397 148398 148399 148400 148401 148402 148403 148404 148405 148406 148407 148408 148409 | w.eCode = 1; w.xExprCallback = exprNodeIsDeterministic; w.xSelectCallback = sqlite3SelectWalkFail; sqlite3WalkExpr(&w, p); return w.eCode; } /* ** Generate the beginning of the loop used for WHERE clause processing. ** The return value is a pointer to an opaque structure that contains ** information needed to terminate the loop. Later, the calling routine ** should invoke sqlite3WhereEnd() with the return value of this function ** in order to complete the WHERE clause processing. ** | > > > > > > > > > > > > > > > > > > > > > > | 149347 149348 149349 149350 149351 149352 149353 149354 149355 149356 149357 149358 149359 149360 149361 149362 149363 149364 149365 149366 149367 149368 149369 149370 149371 149372 149373 149374 149375 149376 149377 149378 149379 149380 149381 149382 | w.eCode = 1; w.xExprCallback = exprNodeIsDeterministic; w.xSelectCallback = sqlite3SelectWalkFail; sqlite3WalkExpr(&w, p); return w.eCode; } #ifdef WHERETRACE_ENABLED /* ** Display all WhereLoops in pWInfo */ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ WhereLoop *p; int i; static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%(sizeof(zLabel)-1)]; sqlite3WhereLoopPrint(p, pWC); } } } # define WHERETRACE_ALL_LOOPS(W,C) showAllWhereLoops(W,C) #else # define WHERETRACE_ALL_LOOPS(W,C) #endif /* ** Generate the beginning of the loop used for WHERE clause processing. ** The return value is a pointer to an opaque structure that contains ** information needed to terminate the loop. Later, the calling routine ** should invoke sqlite3WhereEnd() with the return value of this function ** in order to complete the WHERE clause processing. ** |
148697 148698 148699 148700 148701 148702 148703 | sqlite3WhereClausePrint(sWLB.pWC); } #endif if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; | | > > > > > > > > | < > > > | < < < | < | > > > | 149670 149671 149672 149673 149674 149675 149676 149677 149678 149679 149680 149681 149682 149683 149684 149685 149686 149687 149688 149689 149690 149691 149692 149693 149694 149695 149696 149697 149698 149699 149700 149701 149702 149703 149704 149705 | sqlite3WhereClausePrint(sWLB.pWC); } #endif if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; #ifdef SQLITE_ENABLE_STAT4 /* If one or more WhereTerm.truthProb values were used in estimating ** loop parameters, but then those truthProb values were subsequently ** changed based on STAT4 information while computing subsequent loops, ** then we need to rerun the whole loop building process so that all ** loops will be built using the revised truthProb values. */ if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){ WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); WHERETRACE(0xffff, ("**** Redo all loop computations due to" " TERM_HIGHTRUTH changes ****\n")); while( pWInfo->pLoops ){ WhereLoop *p = pWInfo->pLoops; pWInfo->pLoops = p->pNextLoop; whereLoopDelete(db, p); } rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; } #endif WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); wherePathSolver(pWInfo, 0); if( db->mallocFailed ) goto whereBeginError; if( pWInfo->pOrderBy ){ wherePathSolver(pWInfo, pWInfo->nRowOut+1); if( db->mallocFailed ) goto whereBeginError; } |
148980 148981 148982 148983 148984 148985 148986 | sqlite3VdbeSetP4KeyInfo(pParse, pIx); if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED ){ | | | 149962 149963 149964 149965 149966 149967 149968 149969 149970 149971 149972 149973 149974 149975 149976 | sqlite3VdbeSetP4KeyInfo(pParse, pIx); if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED ){ sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); } VdbeComment((v, "%s", pIx->zName)); #ifdef SQLITE_ENABLE_COLUMN_USED_MASK { u64 colUsed = 0; int ii, jj; for(ii=0; ii<pIx->nColumn; ii++){ |
149138 149139 149140 149141 149142 149143 149144 | int j; sqlite3VdbeResolveLabel(v, pLevel->addrNxt); for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ sqlite3VdbeJumpHere(v, pIn->addrInTop+1); if( pIn->eEndLoopOp!=OP_Noop ){ if( pIn->nPrefix ){ assert( pLoop->wsFlags & WHERE_IN_EARLYOUT ); | < < < < < < | > > > > > > > | 150120 150121 150122 150123 150124 150125 150126 150127 150128 150129 150130 150131 150132 150133 150134 150135 150136 150137 150138 150139 150140 150141 150142 150143 150144 150145 150146 150147 150148 150149 150150 150151 150152 150153 | int j; sqlite3VdbeResolveLabel(v, pLevel->addrNxt); for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ sqlite3VdbeJumpHere(v, pIn->addrInTop+1); if( pIn->eEndLoopOp!=OP_Noop ){ if( pIn->nPrefix ){ assert( pLoop->wsFlags & WHERE_IN_EARLYOUT ); if( pLevel->iLeftJoin ){ /* For LEFT JOIN queries, cursor pIn->iCur may not have been ** opened yet. This occurs for WHERE clauses such as ** "a = ? AND b IN (...)", where the index is on (a, b). If ** the RHS of the (a=?) is NULL, then the "b IN (...)" may ** never have been coded, but the body of the loop run to ** return the null-row. So, if the cursor is not open yet, ** jump over the OP_Next or OP_Prev instruction about to ** be coded. */ sqlite3VdbeAddOp2(v, OP_IfNotOpen, pIn->iCur, sqlite3VdbeCurrentAddr(v) + 2 + ((pLoop->wsFlags & WHERE_VIRTUALTABLE)==0) ); VdbeCoverage(v); } if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, sqlite3VdbeCurrentAddr(v)+2, pIn->iBase, pIn->nPrefix); VdbeCoverage(v); } } sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); VdbeCoverage(v); VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Prev); VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Next); } |
150236 150237 150238 150239 150240 150241 150242 | ExprList *pAppend, /* List of values to append. Might be NULL */ int bIntToNull ){ if( pAppend ){ int i; int nInit = pList ? pList->nExpr : 0; for(i=0; i<pAppend->nExpr; i++){ | < | > > > > > > | | | > | 151219 151220 151221 151222 151223 151224 151225 151226 151227 151228 151229 151230 151231 151232 151233 151234 151235 151236 151237 151238 151239 151240 151241 151242 151243 151244 151245 | ExprList *pAppend, /* List of values to append. Might be NULL */ int bIntToNull ){ if( pAppend ){ int i; int nInit = pList ? pList->nExpr : 0; for(i=0; i<pAppend->nExpr; i++){ Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); if( bIntToNull && pDup ){ int iDummy; Expr *pSub; for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){ assert( pSub ); } if( sqlite3ExprIsInteger(pSub, &iDummy) ){ pSub->op = TK_NULL; pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); pSub->u.zToken = 0; } } pList = sqlite3ExprListAppend(pParse, pList, pDup); if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; } } return pList; } |
150274 150275 150276 150277 150278 150279 150280 150281 150282 150283 150284 150285 150286 150287 | Expr *pHaving = p->pHaving; ExprList *pSort = 0; ExprList *pSublist = 0; /* Expression list for sub-query */ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ Table *pTab; pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ return sqlite3ErrorToParser(db, SQLITE_NOMEM); } p->pSrc = 0; | > | 151263 151264 151265 151266 151267 151268 151269 151270 151271 151272 151273 151274 151275 151276 151277 | Expr *pHaving = p->pHaving; ExprList *pSort = 0; ExprList *pSublist = 0; /* Expression list for sub-query */ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ Table *pTab; u32 selFlags = p->selFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ return sqlite3ErrorToParser(db, SQLITE_NOMEM); } p->pSrc = 0; |
150363 150364 150365 150366 150367 150368 150369 150370 150371 150372 150373 150374 150375 150376 | p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); if( pTab2==0 ){ /* Might actually be some other kind of error, but in that case ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get ** the correct error message regardless. */ rc = SQLITE_NOMEM; }else{ memcpy(pTab, pTab2, sizeof(Table)); | > | 151353 151354 151355 151356 151357 151358 151359 151360 151361 151362 151363 151364 151365 151366 151367 | p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); pSub->selFlags |= (selFlags & SF_Aggregate); if( pTab2==0 ){ /* Might actually be some other kind of error, but in that case ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get ** the correct error message regardless. */ rc = SQLITE_NOMEM; }else{ memcpy(pTab, pTab2, sizeof(Table)); |
151251 151252 151253 151254 151255 151256 151257 151258 151259 151260 151261 151262 151263 151264 | static int windowInitAccum(Parse *pParse, Window *pMWin){ Vdbe *v = sqlite3GetVdbe(pParse); int regArg; int nArg = 0; Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ FuncDef *pFunc = pWin->pFunc; sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); if( pMWin->regStartRowid==0 ){ if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); } | > | 152242 152243 152244 152245 152246 152247 152248 152249 152250 152251 152252 152253 152254 152255 152256 | static int windowInitAccum(Parse *pParse, Window *pMWin){ Vdbe *v = sqlite3GetVdbe(pParse); int regArg; int nArg = 0; Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ FuncDef *pFunc = pWin->pFunc; assert( pWin->regAccum ); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); if( pMWin->regStartRowid==0 ){ if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); } |
151629 151630 151631 151632 151633 151634 151635 151636 151637 151638 151639 151640 151641 151642 | pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eFrmType = p->eFrmType; pNew->eEnd = p->eEnd; pNew->eStart = p->eStart; pNew->eExclude = p->eExclude; pNew->regResult = p->regResult; pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; pNew->bImplicitFrame = p->bImplicitFrame; } } return pNew; | > > > > | 152621 152622 152623 152624 152625 152626 152627 152628 152629 152630 152631 152632 152633 152634 152635 152636 152637 152638 | pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eFrmType = p->eFrmType; pNew->eEnd = p->eEnd; pNew->eStart = p->eStart; pNew->eExclude = p->eExclude; pNew->regResult = p->regResult; pNew->regAccum = p->regAccum; pNew->iArgCol = p->iArgCol; pNew->iEphCsr = p->iEphCsr; pNew->bExprArgs = p->bExprArgs; pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; pNew->bImplicitFrame = p->bImplicitFrame; } } return pNew; |
152466 152467 152468 152469 152470 152471 152472 152473 152474 152475 152476 152477 152478 152479 | static Expr *tokenExpr(Parse *pParse, int op, Token t){ Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); if( p ){ /* memset(p, 0, sizeof(Expr)); */ p->op = (u8)op; p->affExpr = 0; p->flags = EP_Leaf; p->iAgg = -1; p->pLeft = p->pRight = 0; p->x.pList = 0; p->pAggInfo = 0; p->y.pTab = 0; p->op2 = 0; p->iTable = 0; | > | 153462 153463 153464 153465 153466 153467 153468 153469 153470 153471 153472 153473 153474 153475 153476 | static Expr *tokenExpr(Parse *pParse, int op, Token t){ Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); if( p ){ /* memset(p, 0, sizeof(Expr)); */ p->op = (u8)op; p->affExpr = 0; p->flags = EP_Leaf; ExprClearVVAProperties(p); p->iAgg = -1; p->pLeft = p->pRight = 0; p->x.pList = 0; p->pAggInfo = 0; p->y.pTab = 0; p->op2 = 0; p->iTable = 0; |
156534 156535 156536 156537 156538 156539 156540 156541 156542 156543 156544 156545 156546 156547 | ** expr1 NOT IN () ** ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy202); yymsp[-4].minor.yy202 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy192 ? "1" : "0"); }else{ yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); if( yymsp[-4].minor.yy202 ){ yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy242; sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); }else{ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); | > > > > > > > | 157531 157532 157533 157534 157535 157536 157537 157538 157539 157540 157541 157542 157543 157544 157545 157546 157547 157548 157549 157550 157551 | ** expr1 NOT IN () ** ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy202); yymsp[-4].minor.yy202 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy192 ? "1" : "0"); }else if( yymsp[-1].minor.yy242->nExpr==1 && sqlite3ExprIsConstant(yymsp[-1].minor.yy242->a[0].pExpr) ){ Expr *pRHS = yymsp[-1].minor.yy242->a[0].pExpr; yymsp[-1].minor.yy242->a[0].pExpr = 0; sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy202, pRHS); if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); }else{ yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); if( yymsp[-4].minor.yy202 ){ yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy242; sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); }else{ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); |
157805 157806 157807 157808 157809 157810 157811 | static int keywordCode(const char *z, int n, int *pType){ int i, j; const char *zKW; if( n>=2 ){ i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) % 127; for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ if( aKWLen[i]!=n ) continue; | < > > > > > > | 158809 158810 158811 158812 158813 158814 158815 158816 158817 158818 158819 158820 158821 158822 158823 158824 158825 158826 158827 158828 158829 158830 158831 158832 158833 | static int keywordCode(const char *z, int n, int *pType){ int i, j; const char *zKW; if( n>=2 ){ i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) % 127; for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ if( aKWLen[i]!=n ) continue; zKW = &zKWText[aKWOffset[i]]; #ifdef SQLITE_ASCII if( (z[0]&~0x20)!=zKW[0] ) continue; if( (z[1]&~0x20)!=zKW[1] ) continue; j = 2; while( j<n && (z[j]&~0x20)==zKW[j] ){ j++; } #endif #ifdef SQLITE_EBCDIC if( toupper(z[0])!=zKW[0] ) continue; if( toupper(z[1])!=zKW[1] ) continue; j = 2; while( j<n && toupper(z[j])==zKW[j] ){ j++; } #endif if( j<n ) continue; testcase( i==0 ); /* REINDEX */ testcase( i==1 ); /* INDEXED */ testcase( i==2 ); /* INDEX */ testcase( i==3 ); /* DESC */ |
158408 158409 158410 158411 158412 158413 158414 | yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; if( db->nVdbeActive==0 ){ | | | 159417 159418 159419 159420 159421 159422 159423 159424 159425 159426 159427 159428 159429 159430 159431 | yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; if( db->nVdbeActive==0 ){ AtomicStore(&db->u1.isInterrupted, 0); } pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); #ifdef SQLITE_DEBUG if( db->flags & SQLITE_ParserTrace ){ printf("parser: [[[%s]]]\n", zSql); |
158453 158454 158455 158456 158457 158458 158459 | assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW ); #else if( tokenType>=TK_SPACE ){ assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); #endif /* SQLITE_OMIT_WINDOWFUNC */ | | | 159462 159463 159464 159465 159466 159467 159468 159469 159470 159471 159472 159473 159474 159475 159476 | assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW ); #else if( tokenType>=TK_SPACE ){ assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); #endif /* SQLITE_OMIT_WINDOWFUNC */ if( AtomicLoad(&db->u1.isInterrupted) ){ pParse->rc = SQLITE_INTERRUPT; break; } if( tokenType==TK_SPACE ){ zSql += n; continue; } |
159120 159121 159122 159123 159124 159125 159126 159127 159128 159129 159130 159131 159132 159133 | } /* extern "C" */ #endif /* __cplusplus */ /************** End of sqliteicu.h *******************************************/ /************** Continuing where we left off in main.c ***********************/ #endif #ifdef SQLITE_ENABLE_JSON1 SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_STMTVTAB SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); #endif #ifdef SQLITE_ENABLE_FTS5 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | 160129 160130 160131 160132 160133 160134 160135 160136 160137 160138 160139 160140 160141 160142 160143 160144 160145 160146 160147 160148 160149 160150 160151 160152 160153 160154 160155 160156 160157 160158 160159 160160 160161 160162 160163 160164 160165 160166 160167 160168 160169 160170 160171 160172 160173 160174 160175 160176 160177 160178 160179 160180 160181 160182 160183 160184 160185 160186 160187 160188 160189 160190 160191 160192 160193 160194 160195 160196 160197 160198 160199 160200 160201 160202 160203 160204 160205 160206 160207 160208 160209 160210 160211 160212 160213 160214 | } /* extern "C" */ #endif /* __cplusplus */ /************** End of sqliteicu.h *******************************************/ /************** Continuing where we left off in main.c ***********************/ #endif /* ** This is an extension initializer that is a no-op and always ** succeeds, except that it fails if the fault-simulation is set ** to 500. */ static int sqlite3TestExtInit(sqlite3 *db){ (void)db; return sqlite3FaultSim(500); } /* ** Forward declarations of external module initializer functions ** for modules that need them. */ #ifdef SQLITE_ENABLE_FTS1 SQLITE_PRIVATE int sqlite3Fts1Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_FTS2 SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_FTS5 SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_JSON1 SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_STMTVTAB SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); #endif /* ** An array of pointers to extension initializer functions for ** built-in extensions. */ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { #ifdef SQLITE_ENABLE_FTS1 sqlite3Fts1Init, #endif #ifdef SQLITE_ENABLE_FTS2 sqlite3Fts2Init, #endif #ifdef SQLITE_ENABLE_FTS3 sqlite3Fts3Init, #endif #ifdef SQLITE_ENABLE_FTS5 sqlite3Fts5Init, #endif #if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) sqlite3IcuInit, #endif #ifdef SQLITE_ENABLE_RTREE sqlite3RtreeInit, #endif #ifdef SQLITE_ENABLE_DBPAGE_VTAB sqlite3DbpageRegister, #endif #ifdef SQLITE_ENABLE_DBSTAT_VTAB sqlite3DbstatRegister, #endif sqlite3TestExtInit, #ifdef SQLITE_ENABLE_JSON1 sqlite3Json1Init, #endif #ifdef SQLITE_ENABLE_STMTVTAB sqlite3StmtVtabInit, #endif #ifdef SQLITE_ENABLE_BYTECODE_VTAB sqlite3VdbeBytecodeVtabInit, #endif }; #ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant ** contains the text of SQLITE_VERSION macro. */ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; #endif |
159256 159257 159258 159259 159260 159261 159262 | assert( SQLITE_PTRSIZE==sizeof(char*) ); /* If SQLite is already completely initialized, then this call ** to sqlite3_initialize() should be a no-op. But the initialization ** must be complete. So isInit must not be set until the very end ** of this routine. */ | | > > > | 160328 160329 160330 160331 160332 160333 160334 160335 160336 160337 160338 160339 160340 160341 160342 160343 160344 160345 | assert( SQLITE_PTRSIZE==sizeof(char*) ); /* If SQLite is already completely initialized, then this call ** to sqlite3_initialize() should be a no-op. But the initialization ** must be complete. So isInit must not be set until the very end ** of this routine. */ if( sqlite3GlobalConfig.isInit ){ sqlite3MemoryBarrier(); return SQLITE_OK; } /* Make sure the mutex subsystem is initialized. If unable to ** initialize the mutex subsystem, return early with the error. ** If the system is so sick that we are unable to allocate a mutex, ** there is not much SQLite is going to be able to do. ** ** The mutex subsystem must take care of serializing its own |
159342 159343 159344 159345 159346 159347 159348 159349 159350 159351 159352 159353 159354 159355 | if( rc==SQLITE_OK ){ rc = sqlite3MemdbInit(); } #endif if( rc==SQLITE_OK ){ sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); sqlite3GlobalConfig.isInit = 1; #ifdef SQLITE_EXTRA_INIT bRunExtraInit = 1; #endif } sqlite3GlobalConfig.inProgress = 0; } | > | 160417 160418 160419 160420 160421 160422 160423 160424 160425 160426 160427 160428 160429 160430 160431 | if( rc==SQLITE_OK ){ rc = sqlite3MemdbInit(); } #endif if( rc==SQLITE_OK ){ sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); sqlite3MemoryBarrier(); sqlite3GlobalConfig.isInit = 1; #ifdef SQLITE_EXTRA_INIT bRunExtraInit = 1; #endif } sqlite3GlobalConfig.inProgress = 0; } |
160643 160644 160645 160646 160647 160648 160649 | ** argument. ** ** Return non-zero to retry the lock. Return zero to stop trying ** and cause SQLite to return SQLITE_BUSY. */ static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ | | < < < < < < < < < < < < < < < | < < < < < < < < | < | 161719 161720 161721 161722 161723 161724 161725 161726 161727 161728 161729 161730 161731 161732 161733 161734 161735 161736 161737 161738 161739 161740 161741 161742 161743 161744 161745 161746 161747 161748 161749 161750 161751 161752 161753 161754 161755 161756 161757 161758 161759 161760 161761 161762 161763 161764 161765 161766 161767 161768 161769 161770 161771 161772 161773 161774 161775 161776 161777 161778 161779 161780 161781 161782 161783 161784 161785 161786 | ** argument. ** ** Return non-zero to retry the lock. Return zero to stop trying ** and cause SQLite to return SQLITE_BUSY. */ static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ int count /* Number of times table has been busy */ ){ #if SQLITE_OS_WIN || HAVE_USLEEP /* This case is for systems that have support for sleeping for fractions of ** a second. Examples: All windows systems, unix systems with usleep() */ static const u8 delays[] = { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; static const u8 totals[] = { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; # define NDELAY ArraySize(delays) sqlite3 *db = (sqlite3 *)ptr; int tmout = db->busyTimeout; int delay, prior; assert( count>=0 ); if( count < NDELAY ){ delay = delays[count]; prior = totals[count]; }else{ delay = delays[NDELAY-1]; prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); } if( prior + delay > tmout ){ delay = tmout - prior; if( delay<=0 ) return 0; } sqlite3OsSleep(db->pVfs, delay*1000); return 1; #else /* This case for unix systems that lack usleep() support. Sleeping ** must be done in increments of whole seconds */ sqlite3 *db = (sqlite3 *)ptr; int tmout = ((sqlite3 *)ptr)->busyTimeout; if( (count+1)*1000 > tmout ){ return 0; } sqlite3OsSleep(db->pVfs, 1000000); return 1; #endif } /* ** Invoke the given busy handler. ** ** This routine is called when an operation failed to acquire a ** lock on VFS file pFile. ** ** If this routine returns non-zero, the lock is retried. If it ** returns 0, the operation aborts with an SQLITE_BUSY error. */ SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ int rc; if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; rc = p->xBusyHandler(p->pBusyArg, p->nBusy); if( rc==0 ){ p->nBusy = -1; }else{ p->nBusy++; } return rc; } |
160745 160746 160747 160748 160749 160750 160751 | #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->busyHandler.xBusyHandler = xBusy; db->busyHandler.pBusyArg = pArg; db->busyHandler.nBusy = 0; | < | 161797 161798 161799 161800 161801 161802 161803 161804 161805 161806 161807 161808 161809 161810 | #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->busyHandler.xBusyHandler = xBusy; db->busyHandler.pBusyArg = pArg; db->busyHandler.nBusy = 0; db->busyTimeout = 0; sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } #ifndef SQLITE_OMIT_PROGRESS_CALLBACK /* |
160796 160797 160798 160799 160800 160801 160802 | #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif if( ms>0 ){ sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, (void*)db); db->busyTimeout = ms; | < | | 161847 161848 161849 161850 161851 161852 161853 161854 161855 161856 161857 161858 161859 161860 161861 161862 161863 161864 161865 161866 161867 161868 161869 161870 161871 161872 161873 161874 161875 161876 161877 | #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif if( ms>0 ){ sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, (void*)db); db->busyTimeout = ms; }else{ sqlite3_busy_handler(db, 0, 0); } return SQLITE_OK; } /* ** Cause any pending operation to stop at its earliest opportunity. */ SQLITE_API void sqlite3_interrupt(sqlite3 *db){ #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){ (void)SQLITE_MISUSE_BKPT; return; } #endif AtomicStore(&db->u1.isInterrupted, 1); } /* ** This function is exactly the same as sqlite3_create_function(), except ** that it is designed to be called by internal code. The difference is ** that if a malloc() fails in sqlite3_create_function(), an error code |
161435 161436 161437 161438 161439 161440 161441 | sqlite3Error(db, rc); } rc = sqlite3ApiExit(db, rc); /* If there are no active statements, clear the interrupt flag at this ** point. */ if( db->nVdbeActive==0 ){ | | | 162485 162486 162487 162488 162489 162490 162491 162492 162493 162494 162495 162496 162497 162498 162499 | sqlite3Error(db, rc); } rc = sqlite3ApiExit(db, rc); /* If there are no active statements, clear the interrupt flag at this ** point. */ if( db->nVdbeActive==0 ){ AtomicStore(&db->u1.isInterrupted, 0); } sqlite3_mutex_leave(db->mutex); return rc; #endif } |
161848 161849 161850 161851 161852 161853 161854 | ** "cache=xxx" or "mode=xxx" query parameters. ** ** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to ** the VFS that should be used to open the database file. *pzFile is set to ** point to a buffer containing the name of the file to open. The value ** stored in *pzFile is a database name acceptable to sqlite3_uri_parameter() ** and is in the same format as names created using sqlite3_create_filename(). | | | 162898 162899 162900 162901 162902 162903 162904 162905 162906 162907 162908 162909 162910 162911 162912 | ** "cache=xxx" or "mode=xxx" query parameters. ** ** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to ** the VFS that should be used to open the database file. *pzFile is set to ** point to a buffer containing the name of the file to open. The value ** stored in *pzFile is a database name acceptable to sqlite3_uri_parameter() ** and is in the same format as names created using sqlite3_create_filename(). ** The caller must invoke sqlite3_free_filename() (not sqlite3_free()!) on ** the value returned in *pzFile to avoid a memory leak. ** ** If an error occurs, then an SQLite error code is returned and *pzErrMsg ** may be set to point to a buffer containing an English language error ** message. It is the responsibility of the caller to eventually release ** this buffer by calling sqlite3_free(). */ |
162081 162082 162083 162084 162085 162086 162087 | *ppVfs = sqlite3_vfs_find(zVfs); if( *ppVfs==0 ){ *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); rc = SQLITE_ERROR; } parse_uri_out: if( rc!=SQLITE_OK ){ | | | 163131 163132 163133 163134 163135 163136 163137 163138 163139 163140 163141 163142 163143 163144 163145 | *ppVfs = sqlite3_vfs_find(zVfs); if( *ppVfs==0 ){ *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); rc = SQLITE_ERROR; } parse_uri_out: if( rc!=SQLITE_OK ){ sqlite3_free_filename(zFile); zFile = 0; } *pFlags = flags; *pzFile = zFile; return rc; } |
162104 162105 162106 162107 162108 162109 162110 | zFilename += sqlite3Strlen30(zFilename) + 1; if( x==0 ) return zFilename; zFilename += sqlite3Strlen30(zFilename) + 1; } return 0; } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > | 163154 163155 163156 163157 163158 163159 163160 163161 163162 163163 163164 163165 163166 163167 163168 163169 163170 163171 163172 163173 163174 163175 163176 163177 163178 163179 163180 163181 163182 163183 163184 163185 163186 | zFilename += sqlite3Strlen30(zFilename) + 1; if( x==0 ) return zFilename; zFilename += sqlite3Strlen30(zFilename) + 1; } return 0; } /* ** This routine does the work of opening a database on behalf of ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" ** is UTF-8 encoded. */ static int openDatabase( const char *zFilename, /* Database filename UTF-8 encoded */ sqlite3 **ppDb, /* OUT: Returned database handle */ unsigned int flags, /* Operational flags */ const char *zVfs /* Name of the VFS to use */ ){ sqlite3 *db; /* Store allocated handle here */ int rc; /* Return code */ int isThreadsafe; /* True for threadsafe connections */ char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */ char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */ int i; /* Loop counter */ #ifdef SQLITE_ENABLE_API_ARMOR if( ppDb==0 ) return SQLITE_MISUSE_BKPT; #endif *ppDb = 0; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); |
162305 162306 162307 162308 162309 162310 162311 162312 162313 162314 162315 162316 162317 162318 | #endif #if defined(SQLITE_ENABLE_QPSG) | SQLITE_EnableQPSG #endif #if defined(SQLITE_DEFAULT_DEFENSIVE) | SQLITE_Defensive #endif ; sqlite3HashInit(&db->aCollSeq); #ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3HashInit(&db->aModule); #endif /* Add the default collation sequence BINARY. BINARY works for both UTF-8 | > > > | 163321 163322 163323 163324 163325 163326 163327 163328 163329 163330 163331 163332 163333 163334 163335 163336 163337 | #endif #if defined(SQLITE_ENABLE_QPSG) | SQLITE_EnableQPSG #endif #if defined(SQLITE_DEFAULT_DEFENSIVE) | SQLITE_Defensive #endif #if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) | SQLITE_LegacyAlter #endif ; sqlite3HashInit(&db->aCollSeq); #ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3HashInit(&db->aModule); #endif /* Add the default collation sequence BINARY. BINARY works for both UTF-8 |
162326 162327 162328 162329 162330 162331 162332 | createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); if( db->mallocFailed ){ goto opendb_out; } | < < < < < | 163345 163346 163347 163348 163349 163350 163351 163352 163353 163354 163355 163356 163357 163358 | createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); if( db->mallocFailed ){ goto opendb_out; } /* Parse the filename/URI argument ** ** Only allow sensible combinations of bits in the flags argument. ** Throw an error if any non-sense combination is used. If we ** do not block illegal combinations here, it could trigger ** assert() statements in deeper layers. Sensible combinations |
162352 162353 162354 162355 162356 162357 162358 | assert( SQLITE_OPEN_READONLY == 0x01 ); assert( SQLITE_OPEN_READWRITE == 0x02 ); assert( SQLITE_OPEN_CREATE == 0x04 ); testcase( (1<<(flags&7))==0x02 ); /* READONLY */ testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ if( ((1<<(flags&7)) & 0x46)==0 ){ | | | 163366 163367 163368 163369 163370 163371 163372 163373 163374 163375 163376 163377 163378 163379 163380 | assert( SQLITE_OPEN_READONLY == 0x01 ); assert( SQLITE_OPEN_READWRITE == 0x02 ); assert( SQLITE_OPEN_CREATE == 0x04 ); testcase( (1<<(flags&7))==0x02 ); /* READONLY */ testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ if( ((1<<(flags&7)) & 0x46)==0 ){ rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ }else{ rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); } if( rc!=SQLITE_OK ){ if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); sqlite3_free(zErrMsg); |
162375 162376 162377 162378 162379 162380 162381 | rc = SQLITE_NOMEM_BKPT; } sqlite3Error(db, rc); goto opendb_out; } sqlite3BtreeEnter(db->aDb[0].pBt); db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); | | > > | 163389 163390 163391 163392 163393 163394 163395 163396 163397 163398 163399 163400 163401 163402 163403 163404 163405 | rc = SQLITE_NOMEM_BKPT; } sqlite3Error(db, rc); goto opendb_out; } sqlite3BtreeEnter(db->aDb[0].pBt); db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); if( !db->mallocFailed ){ sqlite3SetTextEncoding(db, SCHEMA_ENC(db)); } sqlite3BtreeLeave(db->aDb[0].pBt); db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); /* The default safety_level for the main database is FULL; for the temp ** database it is OFF. This matches the pager layer defaults. */ db->aDb[0].zDbSName = "main"; |
162400 162401 162402 162403 162404 162405 162406 | ** database schema yet. This is delayed until the first time the database ** is accessed. */ sqlite3Error(db, SQLITE_OK); sqlite3RegisterPerConnectionBuiltinFunctions(db); rc = sqlite3_errcode(db); | | < | < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 163416 163417 163418 163419 163420 163421 163422 163423 163424 163425 163426 163427 163428 163429 163430 163431 163432 163433 163434 163435 163436 163437 163438 163439 163440 163441 163442 163443 163444 163445 163446 | ** database schema yet. This is delayed until the first time the database ** is accessed. */ sqlite3Error(db, SQLITE_OK); sqlite3RegisterPerConnectionBuiltinFunctions(db); rc = sqlite3_errcode(db); /* Load compiled-in extensions */ for(i=0; rc==SQLITE_OK && i<ArraySize(sqlite3BuiltinExtensions); i++){ rc = sqlite3BuiltinExtensions[i](db); } /* Load automatic extensions - extensions that have been registered ** using the sqlite3_automatic_extension() API. */ if( rc==SQLITE_OK ){ sqlite3AutoLoadExtensions(db); rc = sqlite3_errcode(db); if( rc!=SQLITE_OK ){ goto opendb_out; } } #ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time ** option gives access to internal functions by default. ** Testing use only!!! */ db->mDbFlags |= DBFLAG_InternalFunc; #endif |
162523 162524 162525 162526 162527 162528 162529 | #ifdef SQLITE_ENABLE_SQLLOG if( sqlite3GlobalConfig.xSqllog ){ /* Opening a db handle. Fourth parameter is passed 0. */ void *pArg = sqlite3GlobalConfig.pSqllogArg; sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); } #endif | < < < | | 163480 163481 163482 163483 163484 163485 163486 163487 163488 163489 163490 163491 163492 163493 163494 | #ifdef SQLITE_ENABLE_SQLLOG if( sqlite3GlobalConfig.xSqllog ){ /* Opening a db handle. Fourth parameter is passed 0. */ void *pArg = sqlite3GlobalConfig.pSqllogArg; sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); } #endif sqlite3_free_filename(zOpen); return rc & 0xff; } /* ** Open a new database handle. */ |
162753 162754 162755 162756 162757 162758 162759 | testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse"); } SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file"); } | | > > | 163707 163708 163709 163710 163711 163712 163713 163714 163715 163716 163717 163718 163719 163720 163721 163722 163723 163724 163725 163726 163727 163728 163729 | testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse"); } SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file"); } #if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_CORRUPT_PGNO) SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){ char zMsg[100]; sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno); testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); } #endif #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3NomemError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM"); } SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); |
162961 162962 162963 162964 162965 162966 162967 162968 162969 162970 162971 162972 162973 162974 | *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); rc = SQLITE_OK; }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); rc = SQLITE_OK; }else if( op==SQLITE_FCNTL_DATA_VERSION ){ *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); rc = SQLITE_OK; }else{ rc = sqlite3OsFileControl(fd, op, pArg); } sqlite3BtreeLeave(pBtree); } sqlite3_mutex_leave(db->mutex); | > > > > > > > | 163917 163918 163919 163920 163921 163922 163923 163924 163925 163926 163927 163928 163929 163930 163931 163932 163933 163934 163935 163936 163937 | *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); rc = SQLITE_OK; }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); rc = SQLITE_OK; }else if( op==SQLITE_FCNTL_DATA_VERSION ){ *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); rc = SQLITE_OK; }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ int iNew = *(int*)pArg; *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); if( iNew>=0 && iNew<=255 ){ sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); } rc = SQLITE_OK; }else{ rc = sqlite3OsFileControl(fd, op, pArg); } sqlite3BtreeLeave(pBtree); } sqlite3_mutex_leave(db->mutex); |
163178 163179 163180 163181 163182 163183 163184 | ** 123410 little-endian, determined at compile-time */ case SQLITE_TESTCTRL_BYTEORDER: { rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; break; } | < < < < < < < < < < < < < < | 164141 164142 164143 164144 164145 164146 164147 164148 164149 164150 164151 164152 164153 164154 | ** 123410 little-endian, determined at compile-time */ case SQLITE_TESTCTRL_BYTEORDER: { rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; break; } /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) ** ** Enable or disable various optimizations for testing purposes. The ** argument N is a bitmask of optimizations to be disabled. For normal ** operation N should be 0. The idea is that a test program (like the ** SQL Logic Test or SLT test module) can run the same SQL multiple times ** with various optimizations disabled to verify that the same answer |
163374 163375 163376 163377 163378 163379 163380 163381 163382 163383 163384 163385 163386 163387 163388 163389 163390 163391 163392 163393 163394 163395 163396 163397 163398 | */ static const char *databaseName(const char *zName){ while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ zName--; } return zName; } /* ** This is a utility routine, useful to VFS implementations, that checks ** to see if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of the query parameter. ** ** The zFilename argument is the filename pointer passed into the xOpen() ** method of a VFS implementation. The zParam argument is the name of the ** query parameter we seek. This routine returns the value of the zParam ** parameter if it exists. If the parameter does not exist, this routine ** returns a NULL pointer. */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ if( zFilename==0 || zParam==0 ) return 0; zFilename = databaseName(zFilename); return uriParameter(zFilename, zParam); } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < < < < < | 164323 164324 164325 164326 164327 164328 164329 164330 164331 164332 164333 164334 164335 164336 164337 164338 164339 164340 164341 164342 164343 164344 164345 164346 164347 164348 164349 164350 164351 164352 164353 164354 164355 164356 164357 164358 164359 164360 164361 164362 164363 164364 164365 164366 164367 164368 164369 164370 164371 164372 164373 164374 164375 164376 164377 164378 164379 164380 164381 164382 164383 164384 164385 164386 164387 164388 164389 164390 164391 164392 164393 164394 164395 164396 164397 164398 164399 164400 164401 164402 164403 164404 164405 164406 164407 164408 164409 164410 164411 164412 164413 164414 164415 164416 | */ static const char *databaseName(const char *zName){ while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ zName--; } return zName; } /* ** Append text z[] to the end of p[]. Return a pointer to the first ** character after then zero terminator on the new text in p[]. */ static char *appendText(char *p, const char *z){ size_t n = strlen(z); memcpy(p, z, n+1); return p+n+1; } /* ** Allocate memory to hold names for a database, journal file, WAL file, ** and query parameters. The pointer returned is valid for use by ** sqlite3_filename_database() and sqlite3_uri_parameter() and related ** functions. ** ** Memory layout must be compatible with that generated by the pager ** and expected by sqlite3_uri_parameter() and databaseName(). */ SQLITE_API char *sqlite3_create_filename( const char *zDatabase, const char *zJournal, const char *zWal, int nParam, const char **azParam ){ sqlite3_int64 nByte; int i; char *pResult, *p; nByte = strlen(zDatabase) + strlen(zJournal) + strlen(zWal) + 10; for(i=0; i<nParam*2; i++){ nByte += strlen(azParam[i])+1; } pResult = p = sqlite3_malloc64( nByte ); if( p==0 ) return 0; memset(p, 0, 4); p += 4; p = appendText(p, zDatabase); for(i=0; i<nParam*2; i++){ p = appendText(p, azParam[i]); } *(p++) = 0; p = appendText(p, zJournal); p = appendText(p, zWal); *(p++) = 0; *(p++) = 0; assert( (sqlite3_int64)(p - pResult)==nByte ); return pResult + 4; } /* ** Free memory obtained from sqlite3_create_filename(). It is a severe ** error to call this routine with any parameter other than a pointer ** previously obtained from sqlite3_create_filename() or a NULL pointer. */ SQLITE_API void sqlite3_free_filename(char *p){ if( p==0 ) return; p = (char*)databaseName(p); sqlite3_free(p - 4); } /* ** This is a utility routine, useful to VFS implementations, that checks ** to see if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of the query parameter. ** ** The zFilename argument is the filename pointer passed into the xOpen() ** method of a VFS implementation. The zParam argument is the name of the ** query parameter we seek. This routine returns the value of the zParam ** parameter if it exists. If the parameter does not exist, this routine ** returns a NULL pointer. */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ if( zFilename==0 || zParam==0 ) return 0; zFilename = databaseName(zFilename); return uriParameter(zFilename, zParam); } /* ** Return a pointer to the name of Nth query parameter of the filename. */ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N){ if( zFilename==0 || N<0 ) return 0; zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; |
163451 163452 163453 163454 163455 163456 163457 | ** passed into the VFS from the SQLite core. Doing so is similar to ** passing free() a pointer that was not obtained from malloc() - it is ** an error that we cannot easily detect but that will likely cause memory ** corruption. */ SQLITE_API const char *sqlite3_filename_database(const char *zFilename){ return databaseName(zFilename); | < | 164454 164455 164456 164457 164458 164459 164460 164461 164462 164463 164464 164465 164466 164467 | ** passed into the VFS from the SQLite core. Doing so is similar to ** passing free() a pointer that was not obtained from malloc() - it is ** an error that we cannot easily detect but that will likely cause memory ** corruption. */ SQLITE_API const char *sqlite3_filename_database(const char *zFilename){ return databaseName(zFilename); } SQLITE_API const char *sqlite3_filename_journal(const char *zFilename){ zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; while( zFilename[0] ){ zFilename += sqlite3Strlen30(zFilename) + 1; zFilename += sqlite3Strlen30(zFilename) + 1; |
165200 165201 165202 165203 165204 165205 165206 165207 165208 165209 165210 165211 165212 165213 | SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); /* fts3_tokenizer.c */ SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, sqlite3_tokenizer **, char ** ); | > | 166202 166203 166204 166205 166206 166207 166208 166209 166210 166211 166212 166213 166214 166215 166216 | SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut); /* fts3_tokenizer.c */ SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, sqlite3_tokenizer **, char ** ); |
165931 165932 165933 165934 165935 165936 165937 165938 165939 165940 165941 165942 165943 165944 165945 165946 165947 165948 165949 165950 165951 165952 165953 | } if( p->zLanguageid ){ fts3Appendf(pRc, &zRet, ", ?"); } sqlite3_free(zFree); return zRet; } /* ** This function interprets the string at (*pp) as a non-negative integer ** value. It reads the integer and sets *pnOut to the value read, then ** sets *pp to point to the byte immediately following the last byte of ** the integer value. ** ** Only decimal digits ('0'..'9') may be part of an integer value. ** ** If *pp does not being with a decimal digit SQLITE_ERROR is returned and ** the output value undefined. Otherwise SQLITE_OK is returned. ** ** This function is used when parsing the "prefix=" FTS4 parameter. */ static int fts3GobbleInt(const char **pp, int *pnOut){ const int MAX_NPREFIX = 10000000; | > > > > > > > > > > > > > > > > < | < | | | < | > > < | | 166934 166935 166936 166937 166938 166939 166940 166941 166942 166943 166944 166945 166946 166947 166948 166949 166950 166951 166952 166953 166954 166955 166956 166957 166958 166959 166960 166961 166962 166963 166964 166965 166966 166967 166968 166969 166970 166971 166972 166973 166974 166975 166976 166977 166978 166979 166980 166981 166982 166983 166984 166985 166986 166987 166988 166989 166990 | } if( p->zLanguageid ){ fts3Appendf(pRc, &zRet, ", ?"); } sqlite3_free(zFree); return zRet; } /* ** Buffer z contains a positive integer value encoded as utf-8 text. ** Decode this value and store it in *pnOut, returning the number of bytes ** consumed. If an overflow error occurs return a negative value. */ SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut){ u64 iVal = 0; int i; for(i=0; z[i]>='0' && z[i]<='9'; i++){ iVal = iVal*10 + (z[i] - '0'); if( iVal>0x7FFFFFFF ) return -1; } *pnOut = (int)iVal; return i; } /* ** This function interprets the string at (*pp) as a non-negative integer ** value. It reads the integer and sets *pnOut to the value read, then ** sets *pp to point to the byte immediately following the last byte of ** the integer value. ** ** Only decimal digits ('0'..'9') may be part of an integer value. ** ** If *pp does not being with a decimal digit SQLITE_ERROR is returned and ** the output value undefined. Otherwise SQLITE_OK is returned. ** ** This function is used when parsing the "prefix=" FTS4 parameter. */ static int fts3GobbleInt(const char **pp, int *pnOut){ const int MAX_NPREFIX = 10000000; int nInt = 0; /* Output value */ int nByte; nByte = sqlite3Fts3ReadInt(*pp, &nInt); if( nInt>MAX_NPREFIX ){ nInt = 0; } if( nByte==0 ){ return SQLITE_ERROR; } *pnOut = nInt; *pp += nByte; return SQLITE_OK; } /* ** This function is called to allocate an array of Fts3Index structures ** representing the indexes maintained by the current FTS table. FTS tables ** always maintain the main "terms" index, but may also maintain one or |
166854 166855 166856 166857 166858 166859 166860 166861 166862 166863 166864 166865 166866 166867 | int rc = SQLITE_OK; /* Return code */ const char *zCsr = zNode; /* Cursor to iterate through node */ const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ char *zBuffer = 0; /* Buffer to load terms into */ i64 nAlloc = 0; /* Size of allocated buffer */ int isFirstTerm = 1; /* True when processing first term on page */ sqlite3_int64 iChild; /* Block id of child node to descend to */ /* Skip over the 'height' varint that occurs at the start of every ** interior node. Then load the blockid of the left-child of the b-tree ** node into variable iChild. ** ** Even if the data structure on disk is corrupted, this (reading two ** varints from the buffer) does not risk an overread. If zNode is a | > | 167871 167872 167873 167874 167875 167876 167877 167878 167879 167880 167881 167882 167883 167884 167885 | int rc = SQLITE_OK; /* Return code */ const char *zCsr = zNode; /* Cursor to iterate through node */ const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ char *zBuffer = 0; /* Buffer to load terms into */ i64 nAlloc = 0; /* Size of allocated buffer */ int isFirstTerm = 1; /* True when processing first term on page */ sqlite3_int64 iChild; /* Block id of child node to descend to */ int nBuffer = 0; /* Total term size */ /* Skip over the 'height' varint that occurs at the start of every ** interior node. Then load the blockid of the left-child of the b-tree ** node into variable iChild. ** ** Even if the data structure on disk is corrupted, this (reading two ** varints from the buffer) does not risk an overread. If zNode is a |
166878 166879 166880 166881 166882 166883 166884 | return FTS_CORRUPT_VTAB; } while( zCsr<zEnd && (piFirst || piLast) ){ int cmp; /* memcmp() result */ int nSuffix; /* Size of term suffix */ int nPrefix = 0; /* Size of term prefix */ | < > > > > | 167896 167897 167898 167899 167900 167901 167902 167903 167904 167905 167906 167907 167908 167909 167910 167911 167912 167913 167914 167915 167916 167917 167918 | return FTS_CORRUPT_VTAB; } while( zCsr<zEnd && (piFirst || piLast) ){ int cmp; /* memcmp() result */ int nSuffix; /* Size of term suffix */ int nPrefix = 0; /* Size of term prefix */ /* Load the next term on the node into zBuffer. Use realloc() to expand ** the size of zBuffer if required. */ if( !isFirstTerm ){ zCsr += fts3GetVarint32(zCsr, &nPrefix); if( nPrefix>nBuffer ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } } isFirstTerm = 0; zCsr += fts3GetVarint32(zCsr, &nSuffix); assert( nPrefix>=0 && nSuffix>=0 ); if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ rc = FTS_CORRUPT_VTAB; |
167137 167138 167139 167140 167141 167142 167143 | ** the next position. */ static void fts3ReadNextPos( char **pp, /* IN/OUT: Pointer into position-list buffer */ sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ ){ if( (**pp)&0xFE ){ | > | > | 168158 168159 168160 168161 168162 168163 168164 168165 168166 168167 168168 168169 168170 168171 168172 168173 168174 | ** the next position. */ static void fts3ReadNextPos( char **pp, /* IN/OUT: Pointer into position-list buffer */ sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ ){ if( (**pp)&0xFE ){ int iVal; *pp += fts3GetVarint32((*pp), &iVal); *pi += iVal; *pi -= 2; }else{ *pi = POSITION_LIST_END; } } /* |
170267 170268 170269 170270 170271 170272 170273 170274 170275 170276 170277 170278 170279 170280 | if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ Fts3Doclist *pDl = &pLeft->pPhrase->doclist; while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ memset(pDl->pList, 0, pDl->nList); fts3EvalNextRow(pCsr, pLeft, pRc); } } } } break; } case FTSQUERY_OR: { Fts3Expr *pLeft = pExpr->pLeft; | > | 171290 171291 171292 171293 171294 171295 171296 171297 171298 171299 171300 171301 171302 171303 171304 | if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ Fts3Doclist *pDl = &pLeft->pPhrase->doclist; while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ memset(pDl->pList, 0, pDl->nList); fts3EvalNextRow(pCsr, pLeft, pRc); } } pRight->bEof = pLeft->bEof = 1; } } break; } case FTSQUERY_OR: { Fts3Expr *pLeft = pExpr->pLeft; |
172037 172038 172039 172040 172041 172042 172043 | int nKey = pKey->n; char cNext; /* If this is a "NEAR" keyword, check for an explicit nearness. */ if( pKey->eType==FTSQUERY_NEAR ){ assert( nKey==4 ); if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ | < < | < | 173061 173062 173063 173064 173065 173066 173067 173068 173069 173070 173071 173072 173073 173074 173075 | int nKey = pKey->n; char cNext; /* If this is a "NEAR" keyword, check for an explicit nearness. */ if( pKey->eType==FTSQUERY_NEAR ){ assert( nKey==4 ); if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear); } } /* At this point this is probably a keyword. But for that to be true, ** the next byte must contain either whitespace, an open or close ** parenthesis, a quote character, or EOF. */ |
175046 175047 175048 175049 175050 175051 175052 | if( idxNum==1 ){ const char *zByte = (const char *)sqlite3_value_text(apVal[0]); int nByte = sqlite3_value_bytes(apVal[0]); pCsr->zInput = sqlite3_malloc64(nByte+1); if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ | | | 176067 176068 176069 176070 176071 176072 176073 176074 176075 176076 176077 176078 176079 176080 176081 | if( idxNum==1 ){ const char *zByte = (const char *)sqlite3_value_text(apVal[0]); int nByte = sqlite3_value_bytes(apVal[0]); pCsr->zInput = sqlite3_malloc64(nByte+1); if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); pCsr->zInput[nByte] = 0; rc = pTab->pMod->xOpen(pTab->pTok, pCsr->zInput, nByte, &pCsr->pCsr); if( rc==SQLITE_OK ){ pCsr->pCsr->pTokenizer = pTab->pTok; } } } |
176569 176570 176571 176572 176573 176574 176575 176576 176577 176578 176579 176580 176581 176582 | /* Check that the doclist does not appear to extend past the end of the ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; } return SQLITE_OK; } /* | > | 177590 177591 177592 177593 177594 177595 177596 177597 177598 177599 177600 177601 177602 177603 177604 | /* Check that the doclist does not appear to extend past the end of the ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) || pReader->nDoclist==0 ){ return FTS_CORRUPT_VTAB; } return SQLITE_OK; } /* |
177656 177657 177658 177659 177660 177661 177662 | ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). */ sqlite3_stmt *pStmt; int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); if( rc!=SQLITE_OK ) return rc; sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); sqlite3_bind_int64(pStmt, 2, | | | 178678 178679 178680 178681 178682 178683 178684 178685 178686 178687 178688 178689 178690 178691 178692 | ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). */ sqlite3_stmt *pStmt; int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); if( rc!=SQLITE_OK ) return rc; sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); sqlite3_bind_int64(pStmt, 2, (((u64)iAbsLevel/FTS3_SEGDIR_MAXLEVEL)+1) * FTS3_SEGDIR_MAXLEVEL ); *pbMax = 0; if( SQLITE_ROW==sqlite3_step(pStmt) ){ *pbMax = sqlite3_column_type(pStmt, 0)==SQLITE_NULL; } return sqlite3_reset(pStmt); |
178222 178223 178224 178225 178226 178227 178228 | i64 *piEndBlock, i64 *pnByte ){ const unsigned char *zText = sqlite3_column_text(pStmt, iCol); if( zText ){ int i; int iMul = 1; | | | | | 179244 179245 179246 179247 179248 179249 179250 179251 179252 179253 179254 179255 179256 179257 179258 179259 179260 179261 179262 179263 179264 179265 179266 179267 179268 179269 179270 179271 179272 | i64 *piEndBlock, i64 *pnByte ){ const unsigned char *zText = sqlite3_column_text(pStmt, iCol); if( zText ){ int i; int iMul = 1; u64 iVal = 0; for(i=0; zText[i]>='0' && zText[i]<='9'; i++){ iVal = iVal*10 + (zText[i] - '0'); } *piEndBlock = (i64)iVal; while( zText[i]==' ' ) i++; iVal = 0; if( zText[i]=='-' ){ i++; iMul = -1; } for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ iVal = iVal*10 + (zText[i] - '0'); } *pnByte = ((i64)iVal * (i64)iMul); } } /* ** A segment of size nByte bytes has just been written to absolute level ** iAbsLevel. Promote any segments that should be promoted as a result. |
180106 180107 180108 180109 180110 180111 180112 180113 180114 180115 180116 180117 180118 180119 | } } /* If nSeg is less that zero, then there is no level with at least ** nMin segments and no hint in the %_stat table. No work to do. ** Exit early in this case. */ if( nSeg<=0 ) break; /* Open a cursor to iterate through the contents of the oldest nSeg ** indexes of absolute level iAbsLevel. If this cursor is opened using ** the 'hint' parameters, it is possible that there are less than nSeg ** segments available in level iAbsLevel. In this case, no work is ** done on iAbsLevel - fall through to the next iteration of the loop ** to start work on some other level. */ | > > > > > > | 181128 181129 181130 181131 181132 181133 181134 181135 181136 181137 181138 181139 181140 181141 181142 181143 181144 181145 181146 181147 | } } /* If nSeg is less that zero, then there is no level with at least ** nMin segments and no hint in the %_stat table. No work to do. ** Exit early in this case. */ if( nSeg<=0 ) break; assert( nMod<=0x7FFFFFFF ); if( iAbsLevel<0 || iAbsLevel>(nMod<<32) ){ rc = FTS_CORRUPT_VTAB; break; } /* Open a cursor to iterate through the contents of the oldest nSeg ** indexes of absolute level iAbsLevel. If this cursor is opened using ** the 'hint' parameters, it is possible that there are less than nSeg ** segments available in level iAbsLevel. In this case, no work is ** done on iAbsLevel - fall through to the next iteration of the loop ** to start work on some other level. */ |
181808 181809 181810 181811 181812 181813 181814 | assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); if( p->flag==FTS3_MATCHINFO_LHITS ){ iStart = pExpr->iPhrase * p->nCol; }else{ iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); } | | | 182836 182837 182838 182839 182840 182841 182842 182843 182844 182845 182846 182847 182848 182849 182850 | assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); if( p->flag==FTS3_MATCHINFO_LHITS ){ iStart = pExpr->iPhrase * p->nCol; }else{ iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); } if( pIter ) while( 1 ){ int nHit = fts3ColumnlistCount(&pIter); if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ if( p->flag==FTS3_MATCHINFO_LHITS ){ p->aMatchinfo[iStart + iCol] = (u32)nHit; }else if( nHit ){ p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); } |
183722 183723 183724 183725 183726 183727 183728 183729 183730 183731 183732 183733 183734 183735 | p->nAlloc = nTotal; return SQLITE_OK; } /* Append N bytes from zIn onto the end of the JsonString string. */ static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; } /* Append formatted text (not to exceed N bytes) to the JsonString. */ | > | 184750 184751 184752 184753 184754 184755 184756 184757 184758 184759 184760 184761 184762 184763 184764 | p->nAlloc = nTotal; return SQLITE_OK; } /* Append N bytes from zIn onto the end of the JsonString string. */ static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ if( N==0 ) return; if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; } /* Append formatted text (not to exceed N bytes) to the JsonString. */ |
189842 189843 189844 189845 189846 189847 189848 189849 | const char *zArg = argv[ii]; if( zArg[0]=='+' ){ pRtree->nAux++; sqlite3_str_appendf(pSql, ",%.*s", rtreeTokenLength(zArg+1), zArg+1); }else if( pRtree->nAux>0 ){ break; }else{ pRtree->nDim2++; | > | > | 190871 190872 190873 190874 190875 190876 190877 190878 190879 190880 190881 190882 190883 190884 190885 190886 190887 190888 | const char *zArg = argv[ii]; if( zArg[0]=='+' ){ pRtree->nAux++; sqlite3_str_appendf(pSql, ",%.*s", rtreeTokenLength(zArg+1), zArg+1); }else if( pRtree->nAux>0 ){ break; }else{ static const char *azFormat[] = {",%.*s REAL", ",%.*s INT"}; pRtree->nDim2++; sqlite3_str_appendf(pSql, azFormat[eCoordType], rtreeTokenLength(zArg), zArg); } } sqlite3_str_appendf(pSql, ");"); zSql = sqlite3_str_finish(pSql); if( !zSql ){ rc = SQLITE_NOMEM; }else if( ii<argc ){ |
192579 192580 192581 192582 192583 192584 192585 | /* There are now 4 possibilities: ** ** 1. uPattern is an unescaped match-all character "%", ** 2. uPattern is an unescaped match-one character "_", ** 3. uPattern is an unescaped escape character, or ** 4. uPattern is to be handled as an ordinary character */ | | | 193610 193611 193612 193613 193614 193615 193616 193617 193618 193619 193620 193621 193622 193623 193624 | /* There are now 4 possibilities: ** ** 1. uPattern is an unescaped match-all character "%", ** 2. uPattern is an unescaped match-one character "_", ** 3. uPattern is an unescaped escape character, or ** 4. uPattern is to be handled as an ordinary character */ if( uPattern==MATCH_ALL && !prevEscape && uPattern!=(uint32_t)uEsc ){ /* Case 1. */ uint8_t c; /* Skip any MATCH_ALL or MATCH_ONE characters that follow a ** MATCH_ALL. For each MATCH_ONE, skip one character in the ** test string. */ |
192605 192606 192607 192608 192609 192610 192611 | if( icuLikeCompare(zPattern, zString, uEsc) ){ return 1; } SQLITE_ICU_SKIP_UTF8(zString); } return 0; | | | | 193636 193637 193638 193639 193640 193641 193642 193643 193644 193645 193646 193647 193648 193649 193650 193651 193652 193653 193654 193655 | if( icuLikeCompare(zPattern, zString, uEsc) ){ return 1; } SQLITE_ICU_SKIP_UTF8(zString); } return 0; }else if( uPattern==MATCH_ONE && !prevEscape && uPattern!=(uint32_t)uEsc ){ /* Case 2. */ if( *zString==0 ) return 0; SQLITE_ICU_SKIP_UTF8(zString); }else if( uPattern==(uint32_t)uEsc && !prevEscape ){ /* Case 3. */ prevEscape = 1; }else{ /* Case 4. */ uint32_t uString; SQLITE_ICU_READ_UTF8(zString, uString); |
199412 199413 199414 199415 199416 199417 199418 199419 199420 199421 199422 199423 199424 199425 | break; } } } i = 0; if( iSchema>=0 ){ pIdxInfo->aConstraintUsage[iSchema].argvIndex = ++i; pIdxInfo->idxNum |= 0x01; } if( iName>=0 ){ pIdxInfo->aConstraintUsage[iName].argvIndex = ++i; pIdxInfo->idxNum |= 0x02; } if( iAgg>=0 ){ | > | 200443 200444 200445 200446 200447 200448 200449 200450 200451 200452 200453 200454 200455 200456 200457 | break; } } } i = 0; if( iSchema>=0 ){ pIdxInfo->aConstraintUsage[iSchema].argvIndex = ++i; pIdxInfo->aConstraintUsage[iSchema].omit = 1; pIdxInfo->idxNum |= 0x01; } if( iName>=0 ){ pIdxInfo->aConstraintUsage[iName].argvIndex = ++i; pIdxInfo->idxNum |= 0x02; } if( iAgg>=0 ){ |
199626 199627 199628 199629 199630 199631 199632 | if( nLocal<0 ) goto statPageIsCorrupt; pCell->nLocal = nLocal; assert( nPayload>=(u32)nLocal ); assert( nLocal<=(nUsable-35) ); if( nPayload>(u32)nLocal ){ int j; int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); | > | > | 200658 200659 200660 200661 200662 200663 200664 200665 200666 200667 200668 200669 200670 200671 200672 200673 200674 | if( nLocal<0 ) goto statPageIsCorrupt; pCell->nLocal = nLocal; assert( nPayload>=(u32)nLocal ); assert( nLocal<=(nUsable-35) ); if( nPayload>(u32)nLocal ){ int j; int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); if( iOff+nLocal>nUsable || nPayload>0x7fffffff ){ goto statPageIsCorrupt; } pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4); pCell->nOvfl = nOvfl; pCell->aOvfl = sqlite3_malloc64(sizeof(u32)*nOvfl); if( pCell->aOvfl==0 ) return SQLITE_NOMEM_BKPT; pCell->aOvfl[0] = sqlite3Get4byte(&aData[iOff+nLocal]); for(j=1; j<nOvfl; j++){ int rc; |
203959 203960 203961 203962 203963 203964 203965 | ){ int i; const char *zSep = ""; int rc = SQLITE_OK; SessionBuffer buf = {0, 0, 0}; int nPk = 0; | | | 204993 204994 204995 204996 204997 204998 204999 205000 205001 205002 205003 205004 205005 205006 205007 | ){ int i; const char *zSep = ""; int rc = SQLITE_OK; SessionBuffer buf = {0, 0, 0}; int nPk = 0; sessionAppendStr(&buf, "DELETE FROM main.", &rc); sessionAppendIdent(&buf, zTab, &rc); sessionAppendStr(&buf, " WHERE ", &rc); for(i=0; i<p->nCol; i++){ if( p->abPK[i] ){ nPk++; sessionAppendStr(&buf, zSep, &rc); |
204042 204043 204044 204045 204046 204047 204048 | ){ int rc = SQLITE_OK; int i; const char *zSep = ""; SessionBuffer buf = {0, 0, 0}; /* Append "UPDATE tbl SET " */ | | | 205076 205077 205078 205079 205080 205081 205082 205083 205084 205085 205086 205087 205088 205089 205090 | ){ int rc = SQLITE_OK; int i; const char *zSep = ""; SessionBuffer buf = {0, 0, 0}; /* Append "UPDATE tbl SET " */ sessionAppendStr(&buf, "UPDATE main.", &rc); sessionAppendIdent(&buf, zTab, &rc); sessionAppendStr(&buf, " SET ", &rc); /* Append the assignments */ for(i=0; i<p->nCol; i++){ sessionAppendStr(&buf, zSep, &rc); sessionAppendIdent(&buf, p->azCol[i], &rc); |
223728 223729 223730 223731 223732 223733 223734 | static void fts5SourceIdFunc( sqlite3_context *pCtx, /* Function call context */ int nArg, /* Number of args */ sqlite3_value **apUnused /* Function arguments */ ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); | | | 224762 224763 224764 224765 224766 224767 224768 224769 224770 224771 224772 224773 224774 224775 224776 | static void fts5SourceIdFunc( sqlite3_context *pCtx, /* Function call context */ int nArg, /* Number of args */ sqlite3_value **apUnused /* Function arguments */ ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); sqlite3_result_text(pCtx, "fts5: 2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a", -1, SQLITE_TRANSIENT); } /* ** Return true if zName is the extension on one of the shadow tables used ** by this module. */ static int fts5ShadowName(const char *zName){ |
227471 227472 227473 227474 227475 227476 227477 227478 227479 227480 227481 227482 227483 227484 | struct Fts5VocabTable { sqlite3_vtab base; char *zFts5Tbl; /* Name of fts5 table */ char *zFts5Db; /* Db containing fts5 table */ sqlite3 *db; /* Database handle */ Fts5Global *pGlobal; /* FTS5 global object for this database */ int eType; /* FTS5_VOCAB_COL, ROW or INSTANCE */ }; struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ Fts5Table *pFts5; /* Associated FTS5 table */ | > | 228505 228506 228507 228508 228509 228510 228511 228512 228513 228514 228515 228516 228517 228518 228519 | struct Fts5VocabTable { sqlite3_vtab base; char *zFts5Tbl; /* Name of fts5 table */ char *zFts5Db; /* Db containing fts5 table */ sqlite3 *db; /* Database handle */ Fts5Global *pGlobal; /* FTS5 global object for this database */ int eType; /* FTS5_VOCAB_COL, ROW or INSTANCE */ unsigned bBusy; /* True if busy */ }; struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ Fts5Table *pFts5; /* Associated FTS5 table */ |
227753 227754 227755 227756 227757 227758 227759 227760 227761 227762 227763 227764 227765 227766 227767 227768 227769 227770 227771 227772 227773 227774 227775 227776 227777 227778 227779 227780 227781 | Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; char *zSql = 0; zSql = sqlite3Fts5Mprintf(&rc, "SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'", pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl ); if( zSql ){ rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); } sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); if( rc==SQLITE_ERROR ) rc = SQLITE_OK; if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } if( rc==SQLITE_OK ){ if( pFts5==0 ){ rc = sqlite3_finalize(pStmt); pStmt = 0; if( rc==SQLITE_OK ){ pVTab->zErrMsg = sqlite3_mprintf( | > > > > > > > > | 228788 228789 228790 228791 228792 228793 228794 228795 228796 228797 228798 228799 228800 228801 228802 228803 228804 228805 228806 228807 228808 228809 228810 228811 228812 228813 228814 228815 228816 228817 228818 228819 228820 228821 228822 228823 228824 | Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; char *zSql = 0; if( pTab->bBusy ){ pVTab->zErrMsg = sqlite3_mprintf( "recursive definition for %s.%s", pTab->zFts5Db, pTab->zFts5Tbl ); return SQLITE_ERROR; } zSql = sqlite3Fts5Mprintf(&rc, "SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'", pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl ); if( zSql ){ rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); } sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); if( rc==SQLITE_ERROR ) rc = SQLITE_OK; pTab->bBusy = 1; if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } pTab->bBusy = 0; if( rc==SQLITE_OK ){ if( pFts5==0 ){ rc = sqlite3_finalize(pStmt); pStmt = 0; if( rc==SQLITE_OK ){ pVTab->zErrMsg = sqlite3_mprintf( |
228370 228371 228372 228373 228374 228375 228376 | sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt)); break; } case STMT_COLUMN_BUSY: { sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); break; } | > | | 229413 229414 229415 229416 229417 229418 229419 229420 229421 229422 229423 229424 229425 229426 229427 229428 | sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt)); break; } case STMT_COLUMN_BUSY: { sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); break; } default: { assert( i==STMT_COLUMN_MEM ); i = SQLITE_STMTSTATUS_MEMUSED + STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; /* Fall thru */ } case STMT_COLUMN_NSCAN: case STMT_COLUMN_NSORT: case STMT_COLUMN_NAIDX: |
228501 228502 228503 228504 228505 228506 228507 | #endif return rc; } #endif /* SQLITE_CORE */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ /************** End of stmt.c ************************************************/ | | | | 229545 229546 229547 229548 229549 229550 229551 229552 229553 229554 229555 229556 229557 229558 | #endif return rc; } #endif /* SQLITE_CORE */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ /************** End of stmt.c ************************************************/ #if __LINE__!=229552 #undef SQLITE_SOURCE_ID #define SQLITE_SOURCE_ID "2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360falt2" #endif /* Return the source-id for this library */ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } /************************** End of sqlite3.c ******************************/ |
Changes to SQLite.Interop/src/core/sqlite3.h.
119 120 121 122 123 124 125 | ** been edited in any way since it was last checked in, then the last ** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ | | | | | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | ** been edited in any way since it was last checked in, then the last ** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.32.0" #define SQLITE_VERSION_NUMBER 3032000 #define SQLITE_SOURCE_ID "2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a" /* ** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros |
295 296 297 298 299 300 301 302 | ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. ** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if ** the [sqlite3] object is successfully destroyed and all associated ** resources are deallocated. ** ** ^If the database connection is associated with unfinalized prepared | > > > > | | | | > > | | | | | < < < < < < < < < < | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. ** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if ** the [sqlite3] object is successfully destroyed and all associated ** resources are deallocated. ** ** Ideally, applications should [sqlite3_finalize | finalize] all ** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and ** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated ** with the [sqlite3] object prior to attempting to close the object. ** ^If the database connection is associated with unfinalized prepared ** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then ** sqlite3_close() will leave the database connection open and return ** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared ** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups, ** it returns [SQLITE_OK] regardless, but instead of deallocating the database ** connection immediately, it marks the database connection as an unusable ** "zombie" and makes arrangements to automatically deallocate the database ** connection after all prepared statements are finalized, all BLOB handles ** are closed, and all backups have finished. The sqlite3_close_v2() interface ** is intended for use with host languages that are garbage collected, and ** where the order in which destructors are called is arbitrary. ** ** ^If an [sqlite3] object is destroyed while a transaction is open, ** the transaction is automatically rolled back. ** ** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] ** must be either a NULL ** pointer or an [sqlite3] object pointer obtained |
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 | #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) #define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) #define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) #define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) #define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) #define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) | > > > | 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) #define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) #define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) #define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) #define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) #define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) |
1083 1084 1085 1086 1087 1088 1089 | ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. ** ^This file control takes the file descriptor out of batch write mode ** so that all subsequent write operations are independent. ** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without ** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. ** ** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] | | > | < | > > > > > > > | 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 | ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. ** ^This file control takes the file descriptor out of batch write mode ** so that all subsequent write operations are independent. ** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without ** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. ** ** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] ** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode is used to configure a VFS ** to block for up to M milliseconds before failing when attempting to ** obtain a file lock using the xLock or xShmLock methods of the VFS. ** The parameter is a pointer to a 32-bit signed integer that contains ** the value that M is to be set to. Before returning, the 32-bit signed ** integer is overwritten with the previous value of M. ** ** <li>[[SQLITE_FCNTL_DATA_VERSION]] ** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to ** a database file. The argument is a pointer to a 32-bit unsigned integer. ** The "data version" for the pager is written into the pointer. The ** "data version" changes whenever any change occurs to the corresponding ** database file, either through SQL statements on the same database ** connection or through transactions committed by separate database ** connections possibly in other processes. The [sqlite3_total_changes()] ** interface can be used to find if any database on the connection has changed, ** but that interface responds to changes on TEMP as well as MAIN and does ** not provide a mechanism to detect changes to MAIN only. Also, the ** [sqlite3_total_changes()] interface responds to internal changes only and ** omits changes made by other database connections. The ** [PRAGMA data_version] command provides a mechanism to detect changes to ** a single attached database that occur due to other database connections, ** but omits changes implemented by the database connection on which it is ** called. This file control is the only mechanism to detect changes that ** happen either internally or externally and that are associated with ** a particular attached database. ** ** <li>[[SQLITE_FCNTL_CKPT_START]] ** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint ** in wal mode before the client starts to copy pages from the wal ** file to the database file. ** ** <li>[[SQLITE_FCNTL_CKPT_DONE]] ** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint ** in wal mode after the client has finished copying pages from the wal ** file to the database file, but before the *-shm file is updated to ** record the fact that the pages have been checkpointed. ** </ul> |
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 | #define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 #define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE #define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE #define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO | > > | 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 | #define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 #define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 #define SQLITE_FCNTL_RESERVE_BYTES 38 #define SQLITE_FCNTL_CKPT_START 39 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE #define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE #define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO |
3529 3530 3531 3532 3533 3534 3535 | /* ** CAPI3REF: Obtain Values For URI Parameters ** ** These are utility routines, useful to [VFS|custom VFS implementations], ** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** | > > > > | | > > > > > > > | 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 | /* ** CAPI3REF: Obtain Values For URI Parameters ** ** These are utility routines, useful to [VFS|custom VFS implementations], ** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** ** The first parameter to these interfaces (hereafter referred to ** as F) must be one of: ** <ul> ** <li> A database filename pointer created by the SQLite core and ** passed into the xOpen() method of a VFS implemention, or ** <li> A filename obtained from [sqlite3_db_filename()], or ** <li> A new filename constructed using [sqlite3_create_filename()]. ** </ul> ** If the F parameter is not one of the above, then the behavior is ** undefined and probably undesirable. Older versions of SQLite were ** more tolerant of invalid F parameters than newer versions. ** ** If F is a suitable filename (as described in the previous paragraph) ** and if P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P ** parameter if it exists or a NULL pointer if P does not appear as a ** query parameter on F. If P is a query parameter of F and it ** has no explicit value, then sqlite3_uri_parameter(F,P) returns ** a pointer to an empty string. ** |
3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 | ** return value from [sqlite3_db_filename()], then the result is ** undefined and is likely a memory access violation. */ SQLITE_API const char *sqlite3_filename_database(const char*); SQLITE_API const char *sqlite3_filename_journal(const char*); SQLITE_API const char *sqlite3_filename_wal(const char*); /* ** CAPI3REF: Error Codes And Messages ** METHOD: sqlite3 ** ** ^If the most recent sqlite3_* API call associated with ** [database connection] D failed, then the sqlite3_errcode(D) interface | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 | ** return value from [sqlite3_db_filename()], then the result is ** undefined and is likely a memory access violation. */ SQLITE_API const char *sqlite3_filename_database(const char*); SQLITE_API const char *sqlite3_filename_journal(const char*); SQLITE_API const char *sqlite3_filename_wal(const char*); /* ** CAPI3REF: Database File Corresponding To A Journal ** ** ^If X is the name of a rollback or WAL-mode journal file that is ** passed into the xOpen method of [sqlite3_vfs], then ** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file] ** object that represents the main database file. ** ** This routine is intended for use in custom [VFS] implementations ** only. It is not a general-purpose interface. ** The argument sqlite3_file_object(X) must be a filename pointer that ** has been passed into [sqlite3_vfs].xOpen method where the ** flags parameter to xOpen contains one of the bits ** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use ** of this routine results in undefined and probably undesirable ** behavior. */ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); /* ** CAPI3REF: Create and Destroy VFS Filenames ** ** These interfces are provided for use by [VFS shim] implementations and ** are not useful outside of that context. ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of ** database filename D with corresponding journal file J and WAL file W and ** with N URI parameters key/values pairs in the array P. The result from ** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that ** is safe to pass to routines like: ** <ul> ** <li> [sqlite3_uri_parameter()], ** <li> [sqlite3_uri_boolean()], ** <li> [sqlite3_uri_int64()], ** <li> [sqlite3_uri_key()], ** <li> [sqlite3_filename_database()], ** <li> [sqlite3_filename_journal()], or ** <li> [sqlite3_filename_wal()]. ** </ul> ** If a memory allocation error occurs, sqlite3_create_filename() might ** return a NULL pointer. The memory obtained from sqlite3_create_filename(X) ** must be released by a corresponding call to sqlite3_free_filename(Y). ** ** The P parameter in sqlite3_create_filename(D,J,W,N,P) should be an array ** of 2*N pointers to strings. Each pair of pointers in this array corresponds ** to a key and value for a query parameter. The P parameter may be a NULL ** pointer if N is zero. None of the 2*N pointers in the P array may be ** NULL pointers and key pointers should not be empty strings. ** None of the D, J, or W parameters to sqlite3_create_filename(D,J,W,N,P) may ** be NULL pointers, though they can be empty strings. ** ** The sqlite3_free_filename(Y) routine releases a memory allocation ** previously obtained from sqlite3_create_filename(). Invoking ** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op. ** ** If the Y parameter to sqlite3_free_filename(Y) is anything other ** than a NULL pointer or a pointer previously acquired from ** sqlite3_create_filename(), then bad things such as heap ** corruption or segfaults may occur. The value Y should be ** used again after sqlite3_free_filename(Y) has been called. This means ** that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y, ** then the corresponding [sqlite3_module.xClose() method should also be ** invoked prior to calling sqlite3_free_filename(Y). */ SQLITE_API char *sqlite3_create_filename( const char *zDatabase, const char *zJournal, const char *zWal, int nParam, const char **azParam ); SQLITE_API void sqlite3_free_filename(char*); /* ** CAPI3REF: Error Codes And Messages ** METHOD: sqlite3 ** ** ^If the most recent sqlite3_* API call associated with ** [database connection] D failed, then the sqlite3_errcode(D) interface |
4195 4196 4197 4198 4199 4200 4201 | ** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. ** ^The index for named parameters can be looked up using the ** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. ** ^The NNN value must be between 1 and the [sqlite3_limit()] | | > > > > > > > > > > > > > > > > > > | | 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 | ** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. ** ^The index for named parameters can be looked up using the ** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. ** ^The NNN value must be between 1 and the [sqlite3_limit()] ** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 32766). ** ** ^The third argument is the value to bind to the parameter. ** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() ** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter ** is ignored and the end result is the same as sqlite3_bind_null(). ** ^If the third parameter to sqlite3_bind_text() is not NULL, then ** it should be a pointer to well-formed UTF8 text. ** ^If the third parameter to sqlite3_bind_text16() is not NULL, then ** it should be a pointer to well-formed UTF16 text. ** ^If the third parameter to sqlite3_bind_text64() is not NULL, then ** it should be a pointer to a well-formed unicode string that is ** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16 ** otherwise. ** ** [[byte-order determination rules]] ^The byte-order of ** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) ** found in first character, which is removed, or in the absence of a BOM ** the byte order is the native byte order of the host ** machine for sqlite3_bind_text16() or the byte order specified in ** the 6th parameter for sqlite3_bind_text64().)^ ** ^If UTF16 input text contains invalid unicode ** characters, then SQLite might change those invalid characters ** into the unicode replacement character: U+FFFD. ** ** ^(In those routines that have a fourth argument, its value is the ** number of bytes in the parameter. To be clear: the value is the ** number of <u>bytes</u> in the value, not the number of characters.)^ ** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() ** is negative, then the length of the string is ** the number of bytes up to the first zero terminator. ** If the fourth parameter to sqlite3_bind_blob() is negative, then ** the behavior is undefined. ** If a non-negative fourth parameter is provided to sqlite3_bind_text() ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL ** terminated. If any NUL characters occurs at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. ** ** ^The fifth argument to the BLOB and string binding interfaces ** is a destructor used to dispose of the BLOB or ** string after SQLite has finished with it. ^The destructor is called |
5382 5383 5384 5385 5386 5387 5388 | ** ** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer ** when first called if N is less than or equal to zero or if a memory ** allocate error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the | | | 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 | ** ** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer ** when first called if N is less than or equal to zero or if a memory ** allocate error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the ** value of N in any subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no ** pointless memory allocations occur. ** ** ^SQLite automatically frees the memory allocated by ** sqlite3_aggregate_context() when the aggregate query concludes. |
5539 5540 5541 5542 5543 5544 5545 | ** ** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. ** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() ** as the text of an error message. ^SQLite interprets the error ** message string from sqlite3_result_error() as UTF-8. ^SQLite | | > | | 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 | ** ** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. ** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() ** as the text of an error message. ^SQLite interprets the error ** message string from sqlite3_result_error() as UTF-8. ^SQLite ** interprets the string from sqlite3_result_error16() as UTF-16 using ** the same [byte-order determination rules] as [sqlite3_bind_text16()]. ** ^If the third parameter to sqlite3_result_error() ** or sqlite3_result_error16() is negative then SQLite takes as the error ** message all text up through the first zero character. ** ^If the third parameter to sqlite3_result_error() or ** sqlite3_result_error16() is non-negative then SQLite takes that many ** bytes (not characters) from the 2nd parameter as the error message. ** ^The sqlite3_result_error() and sqlite3_result_error16() ** routines make a private copy of the error message text before |
5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 | ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. | > > > > > > > > > > > > > > > > > > > | 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 | ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and ** sqlite3_result_text16be() routines, and for sqlite3_result_text64() ** when the encoding is not UTF8, if the input UTF16 begins with a ** byte-order mark (BOM, U+FEFF) then the BOM is removed from the ** string and the rest of the string is interpreted according to the ** byte-order specified by the BOM. ^The byte-order specified by ** the BOM at the beginning of the text overrides the byte-order ** specified by the interface procedure. ^So, for example, if ** sqlite3_result_text16le() is invoked with text that begins ** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the ** first two bytes of input are skipped and the remaining input ** is interpreted as UTF16BE text. ** ** ^For UTF16 input text to the sqlite3_result_text16(), ** sqlite3_result_text16be(), sqlite3_result_text16le(), and ** sqlite3_result_text64() routines, if the text contains invalid ** UTF16 characters, the invalid characters might be converted ** into the unicode replacement character, U+FFFD. ** ** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. |
5813 5814 5815 5816 5817 5818 5819 | ); SQLITE_API int sqlite3_collation_needed16( sqlite3*, void*, void(*)(void*,sqlite3*,int eTextRep,const void*) ); | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 | ); SQLITE_API int sqlite3_collation_needed16( sqlite3*, void*, void(*)(void*,sqlite3*,int eTextRep,const void*) ); #ifdef SQLITE_ENABLE_CEROD /* ** Specify the activation key for a CEROD database. Unless ** activated, none of the CEROD routines will work. */ SQLITE_API void sqlite3_activate_cerod( const char *zPassPhrase /* Activation phrase */ |
7600 7601 7602 7603 7604 7605 7606 | #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 #define SQLITE_TESTCTRL_PENDING_BYTE 11 #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 | | | 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 | #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 #define SQLITE_TESTCTRL_PENDING_BYTE 11 #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 |
Changes to SQLite.Interop/src/core/sqlite3ext.h.
326 327 328 329 330 331 332 333 334 335 336 337 338 339 | int (*drop_modules)(sqlite3*,const char**); /* Version 3.31.0 and later */ sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); const char *(*uri_key)(const char*,int); const char *(*filename_database)(const char*); const char *(*filename_journal)(const char*); const char *(*filename_wal)(const char*); }; /* ** This is the function signature used for all extension entry points. It ** is also defined in the file "loadext.c". */ typedef int (*sqlite3_loadext_entry)( | > > > > > | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | int (*drop_modules)(sqlite3*,const char**); /* Version 3.31.0 and later */ sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); const char *(*uri_key)(const char*,int); const char *(*filename_database)(const char*); const char *(*filename_journal)(const char*); const char *(*filename_wal)(const char*); /* Version 3.32.0 and later */ char *(*create_filename)(const char*,const char*,const char*, int,const char**); void (*free_filename)(char*); sqlite3_file *(*database_file_object)(const char*); }; /* ** This is the function signature used for all extension entry points. It ** is also defined in the file "loadext.c". */ typedef int (*sqlite3_loadext_entry)( |
626 627 628 629 630 631 632 633 634 635 636 637 638 639 | #define sqlite3_drop_modules sqlite3_api->drop_modules /* Version 3.31.0 and later */ #define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 #define sqlite3_uri_key sqlite3_api->uri_key #define sqlite3_filename_database sqlite3_api->filename_database #define sqlite3_filename_journal sqlite3_api->filename_journal #define sqlite3_filename_wal sqlite3_api->filename_wal #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; # define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; | > > > > | 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 | #define sqlite3_drop_modules sqlite3_api->drop_modules /* Version 3.31.0 and later */ #define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 #define sqlite3_uri_key sqlite3_api->uri_key #define sqlite3_filename_database sqlite3_api->filename_database #define sqlite3_filename_journal sqlite3_api->filename_journal #define sqlite3_filename_wal sqlite3_api->filename_wal /* Version 3.32.0 and later */ #define sqlite3_create_filename sqlite3_api->create_filename #define sqlite3_free_filename sqlite3_api->free_filename #define sqlite3_database_file_object sqlite3_api->database_file_object #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; # define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; |
Changes to SQLite.Interop/src/ext/fts5.c.
17886 17887 17888 17889 17890 17891 17892 | static void fts5SourceIdFunc( sqlite3_context *pCtx, /* Function call context */ int nArg, /* Number of args */ sqlite3_value **apUnused /* Function arguments */ ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); | | | 17886 17887 17888 17889 17890 17891 17892 17893 17894 17895 17896 17897 17898 17899 17900 | static void fts5SourceIdFunc( sqlite3_context *pCtx, /* Function call context */ int nArg, /* Number of args */ sqlite3_value **apUnused /* Function arguments */ ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); sqlite3_result_text(pCtx, "fts5: 2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a", -1, SQLITE_TRANSIENT); } /* ** Return true if zName is the extension on one of the shadow tables used ** by this module. */ static int fts5ShadowName(const char *zName){ |
21634 21635 21636 21637 21638 21639 21640 21641 21642 21643 21644 21645 21646 21647 | struct Fts5VocabTable { sqlite3_vtab base; char *zFts5Tbl; /* Name of fts5 table */ char *zFts5Db; /* Db containing fts5 table */ sqlite3 *db; /* Database handle */ Fts5Global *pGlobal; /* FTS5 global object for this database */ int eType; /* FTS5_VOCAB_COL, ROW or INSTANCE */ }; struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ Fts5Table *pFts5; /* Associated FTS5 table */ | > | 21634 21635 21636 21637 21638 21639 21640 21641 21642 21643 21644 21645 21646 21647 21648 | struct Fts5VocabTable { sqlite3_vtab base; char *zFts5Tbl; /* Name of fts5 table */ char *zFts5Db; /* Db containing fts5 table */ sqlite3 *db; /* Database handle */ Fts5Global *pGlobal; /* FTS5 global object for this database */ int eType; /* FTS5_VOCAB_COL, ROW or INSTANCE */ unsigned bBusy; /* True if busy */ }; struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ Fts5Table *pFts5; /* Associated FTS5 table */ |
21916 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 | Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; char *zSql = 0; zSql = sqlite3Fts5Mprintf(&rc, "SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'", pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl ); if( zSql ){ rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); } sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); if( rc==SQLITE_ERROR ) rc = SQLITE_OK; if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } if( rc==SQLITE_OK ){ if( pFts5==0 ){ rc = sqlite3_finalize(pStmt); pStmt = 0; if( rc==SQLITE_OK ){ pVTab->zErrMsg = sqlite3_mprintf( | > > > > > > > > | 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 21947 21948 21949 21950 21951 21952 21953 | Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; char *zSql = 0; if( pTab->bBusy ){ pVTab->zErrMsg = sqlite3_mprintf( "recursive definition for %s.%s", pTab->zFts5Db, pTab->zFts5Tbl ); return SQLITE_ERROR; } zSql = sqlite3Fts5Mprintf(&rc, "SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'", pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl ); if( zSql ){ rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); } sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); if( rc==SQLITE_ERROR ) rc = SQLITE_OK; pTab->bBusy = 1; if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } pTab->bBusy = 0; if( rc==SQLITE_OK ){ if( pFts5==0 ){ rc = sqlite3_finalize(pStmt); pStmt = 0; if( rc==SQLITE_OK ){ pVTab->zErrMsg = sqlite3_mprintf( |
Changes to SQLite.Interop/src/ext/json1.c.
250 251 252 253 254 255 256 257 258 259 260 261 262 263 | p->nAlloc = nTotal; return SQLITE_OK; } /* Append N bytes from zIn onto the end of the JsonString string. */ static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; } /* Append formatted text (not to exceed N bytes) to the JsonString. */ | > | 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | p->nAlloc = nTotal; return SQLITE_OK; } /* Append N bytes from zIn onto the end of the JsonString string. */ static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ if( N==0 ) return; if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; } /* Append formatted text (not to exceed N bytes) to the JsonString. */ |
Changes to System.Data.SQLite/SQLiteException.cs.
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 | /// An attempt to commit a file system transaction failed. /// </summary> IoErr_Commit_Atomic = (IoErr | (30 << 8)), /// <summary> /// An attempt to rollback a file system transaction failed. /// </summary> IoErr_Rollback_Atomic = (IoErr | (31 << 8)), /// <summary> /// A database table is locked in shared-cache mode. /// </summary> Locked_SharedCache = (Locked | (1 << 8)), /// <summary> /// A virtual table in the database is locked. /// </summary> Locked_Vtab = (Locked | (2 << 8)), /// <summary> /// A database file is locked due to a recovery operation. /// </summary> Busy_Recovery = (Busy | (1 << 8)), /// <summary> /// A database file is locked due to snapshot semantics. /// </summary> Busy_Snapshot = (Busy | (2 << 8)), /// <summary> /// A database file cannot be opened because no temporary directory is available. /// </summary> CantOpen_NoTempDir = (CantOpen | (1 << 8)), /// <summary> /// A database file cannot be opened because its path represents a directory. /// </summary> | > > > > > > > > | 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 | /// An attempt to commit a file system transaction failed. /// </summary> IoErr_Commit_Atomic = (IoErr | (30 << 8)), /// <summary> /// An attempt to rollback a file system transaction failed. /// </summary> IoErr_Rollback_Atomic = (IoErr | (31 << 8)), /// <summary> /// Data read from the file system appears to be incorrect. /// </summary> IoErr_Data = (IoErr | (32 << 8)), /// <summary> /// A database table is locked in shared-cache mode. /// </summary> Locked_SharedCache = (Locked | (1 << 8)), /// <summary> /// A virtual table in the database is locked. /// </summary> Locked_Vtab = (Locked | (2 << 8)), /// <summary> /// A database file is locked due to a recovery operation. /// </summary> Busy_Recovery = (Busy | (1 << 8)), /// <summary> /// A database file is locked due to snapshot semantics. /// </summary> Busy_Snapshot = (Busy | (2 << 8)), /// <summary> /// An internal timeout was encountered while waiting for a database lock. /// </summary> Busy_Timeout = (Busy | (3 << 8)), /// <summary> /// A database file cannot be opened because no temporary directory is available. /// </summary> CantOpen_NoTempDir = (CantOpen | (1 << 8)), /// <summary> /// A database file cannot be opened because its path represents a directory. /// </summary> |
768 769 770 771 772 773 774 775 776 777 778 779 780 781 | /// A virtual table is malformed. /// </summary> Corrupt_Vtab = (Corrupt | (1 << 8)), /// <summary> /// A required sequence table is missing or corrupt. /// </summary> Corrupt_Sequence = (Corrupt | (2 << 8)), /// <summary> /// A database file is read-only due to a recovery operation. /// </summary> ReadOnly_Recovery = (ReadOnly | (1 << 8)), /// <summary> /// A database file is read-only because a lock could not be obtained. /// </summary> | > > > > | 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 | /// A virtual table is malformed. /// </summary> Corrupt_Vtab = (Corrupt | (1 << 8)), /// <summary> /// A required sequence table is missing or corrupt. /// </summary> Corrupt_Sequence = (Corrupt | (2 << 8)), /// <summary> /// An index entry that should be present is missing. /// </summary> Corrupt_Index = (Corrupt | (3 << 8)), /// <summary> /// A database file is read-only due to a recovery operation. /// </summary> ReadOnly_Recovery = (ReadOnly | (1 << 8)), /// <summary> /// A database file is read-only because a lock could not be obtained. /// </summary> |
Changes to Targets/SQLite.NET.Settings.targets.
631 632 633 634 635 636 637 | AND via the "INTEROP_CODEC=1" preprocessor define being present in the "INTEROP_EXTRA_DEFINES" macro in the build properties file: "SQLite.Interop\props\SQLite.Interop.20YY.[vs]props" both for the corresponding version(s) of Visual Studio. --> | | | 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 | AND via the "INTEROP_CODEC=1" preprocessor define being present in the "INTEROP_EXTRA_DEFINES" macro in the build properties file: "SQLite.Interop\props\SQLite.Interop.20YY.[vs]props" both for the corresponding version(s) of Visual Studio. --> <InteropCodec Condition="'$(InteropCodec)' == ''">false</InteropCodec> <!-- NOTE: Enable including SEE with the custom built interop DLL (i.e. "SQLite.Interop.dll")? By default, this is disabled. If this is enabled, the "see.c" file will be included from the extensions directory. If this is enabled, it must also be enabled via the "SQLITE_HAS_CODEC=1" preprocessor define being present in the |
Changes to Tests/basic.eagle.
5589 5590 5591 5592 5593 5594 5595 | freeDbConnection unset -nocomplain value result limit limits unset -nocomplain connection db fileName } -constraints {eagle monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {-1 -1 1000000000 1 1000000000 1 2000 1 1000 1 500\ | | | 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 | freeDbConnection unset -nocomplain value result limit limits unset -nocomplain connection db fileName } -constraints {eagle monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {-1 -1 1000000000 1 1000000000 1 2000 1 1000 1 500\ 1 250000000 1 127 1 30 1 50000 1 32766 1 1000 1 0 1}} ############################################################################### reportSQLiteResources $test_channel ############################################################################### |
Changes to Tests/tkt-71bedaca19.eagle.
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 | } -constraints {eagle command.object System.Data.SQLite} -result {Abort 4 Abort_Rollback 516 Auth 23 Auth_User 279 Busy 5 Busy_Recovery 261 Busy_Snapshot 517 CantOpen 14 CantOpen_ConvPath 1038 CantOpen_DirtyWal 1294 CantOpen_FullPath 782 CantOpen_IsDir 526 CantOpen_NoTempDir 270 CantOpen_SymLink 1550 Constraint 19 Constraint_Check 275 Constraint_CommitHook 531 Constraint_ForeignKey 787 Constraint_Function 1043 Constraint_NotNull 1299 Constraint_Pinned 2835 Constraint_PrimaryKey 1555 Constraint_RowId 2579 Constraint_Trigger 1811 Constraint_Unique 2067 Constraint_Vtab 2323 Corrupt 11 Corrupt_Sequence 523 Corrupt_Vtab 267 Done 101 Empty 16 Error 1 Error_Missing_CollSeq 257 Error_Retry 513 | > > | 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 | } -constraints {eagle command.object System.Data.SQLite} -result {Abort 4 Abort_Rollback 516 Auth 23 Auth_User 279 Busy 5 Busy_Recovery 261 Busy_Snapshot 517 Busy_Timeout 773 CantOpen 14 CantOpen_ConvPath 1038 CantOpen_DirtyWal 1294 CantOpen_FullPath 782 CantOpen_IsDir 526 CantOpen_NoTempDir 270 CantOpen_SymLink 1550 Constraint 19 Constraint_Check 275 Constraint_CommitHook 531 Constraint_ForeignKey 787 Constraint_Function 1043 Constraint_NotNull 1299 Constraint_Pinned 2835 Constraint_PrimaryKey 1555 Constraint_RowId 2579 Constraint_Trigger 1811 Constraint_Unique 2067 Constraint_Vtab 2323 Corrupt 11 Corrupt_Index 779 Corrupt_Sequence 523 Corrupt_Vtab 267 Done 101 Empty 16 Error 1 Error_Missing_CollSeq 257 Error_Retry 513 |
84 85 86 87 88 89 90 91 92 93 94 95 96 97 | IoErr_Auth 7178 IoErr_Begin_Atomic 7434 IoErr_Blocked 2826 IoErr_CheckReservedLock 3594 IoErr_Close 4106 IoErr_Commit_Atomic 7690 IoErr_ConvPath 6666 IoErr_Delete 2570 IoErr_Delete_NoEnt 5898 IoErr_Dir_Close 4362 IoErr_Dir_Fsync 1290 IoErr_Fstat 1802 IoErr_Fsync 1034 IoErr_GetTempPath 6410 | > | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | IoErr_Auth 7178 IoErr_Begin_Atomic 7434 IoErr_Blocked 2826 IoErr_CheckReservedLock 3594 IoErr_Close 4106 IoErr_Commit_Atomic 7690 IoErr_ConvPath 6666 IoErr_Data 8202 IoErr_Delete 2570 IoErr_Delete_NoEnt 5898 IoErr_Dir_Close 4362 IoErr_Dir_Fsync 1290 IoErr_Fstat 1802 IoErr_Fsync 1034 IoErr_GetTempPath 6410 |
Changes to Tests/version.eagle.
37 38 39 40 41 42 43 | ############################################################################### # # NOTE: What is the full version of the included SQLite core library? This # must be kept synchronized with the version numbers for the associated # source code and property files. # | | | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | ############################################################################### # # NOTE: What is the full version of the included SQLite core library? This # must be kept synchronized with the version numbers for the associated # source code and property files. # set version(core,full) 3.32.0.0 set version(core,short) 3.32.0 ############################################################################### # # NOTE: What is the full version of the EntityFramework NuGet package (which # is not [necessarily] the same version as the assembly itself) in use # by the System.Data.SQLite NuGet packages? |
Changes to readme.htm.
141 142 143 144 145 146 147 | app.config file:<br /> <pre> <configuration> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | app.config file:<br /> <pre> <configuration> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> </DbProviderFactories> </system.data> </configuration> </pre> <p> See the help documentation for further details on implementing both version-specific (GAC enabled) and version independent DBProviderFactories support. |
Changes to www/news.wiki.
1 2 3 4 5 6 7 8 9 | <title>News</title> <div align="center"><h2><b>Community Support Policies</b></h2></div> <div align="center"><h3><b>Effective May 1, 2017</b></h3></div> <h4>Legacy CryptoAPI Codec</h4> <ul> <li> | > > > > | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <title>News</title> <div align="center"><h2><b>Community Support Policies</b></h2></div> <div align="center"><h3><b>Effective May 1, 2017</b></h3></div> <div align="center"><h3><b>Updated May 22, 2020</b></h3></div> <h4>Legacy CryptoAPI Codec</h4> <ul> <li> It is unsupported. </li> <li> It is disabled in all default build configurations. </li> <li> It may not be possible to build binaries with it enabled. </li> </ul> <h4>Design-Time Components for Visual Studio</h4> <ul> <li> |