1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 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
|
<!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>An Introduction To The SQLite C/C++ Interface</title>
<!-- path= -->
</head>
<body>
<div class=nosearch>
<a href="index.html">
<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0">
</a>
<div><!-- IE hack to prevent disappearing logo --></div>
<div class="tagline desktoponly">
Small. Fast. Reliable.<br>Choose any three.
</div>
<div class="menu mainmenu">
<ul>
<li><a href="index.html">Home</a>
<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
<li class='wideonly'><a href='about.html'>About</a>
<li class='desktoponly'><a href="docs.html">Documentation</a>
<li class='desktoponly'><a href="download.html">Download</a>
<li class='wideonly'><a href='copyright.html'>License</a>
<li class='desktoponly'><a href="support.html">Support</a>
<li class='desktoponly'><a href="prosupport.html">Purchase</a>
<li class='search' id='search_menubutton'>
<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
</ul>
</div>
<div class="menu submenu" id="submenu">
<ul>
<li><a href='about.html'>About</a>
<li><a href='docs.html'>Documentation</a>
<li><a href='download.html'>Download</a>
<li><a href='support.html'>Support</a>
<li><a href='prosupport.html'>Purchase</a>
</ul>
</div>
<div class="searchmenu" id="searchmenu">
<form method="GET" action="search">
<select name="s" id="searchtype">
<option value="d">Search Documentation</option>
<option value="c">Search Changelog</option>
</select>
<input type="text" name="q" id="searchbox" value="">
<input type="submit" value="Go">
</form>
</div>
</div>
<script>
function toggle_div(nm) {
var w = document.getElementById(nm);
if( w.style.display=="block" ){
w.style.display = "none";
}else{
w.style.display = "block";
}
}
function toggle_search() {
var w = document.getElementById("searchmenu");
if( w.style.display=="block" ){
w.style.display = "none";
} else {
w.style.display = "block";
setTimeout(function(){
document.getElementById("searchbox").focus()
}, 30);
}
}
function div_off(nm){document.getElementById(nm).style.display="none";}
window.onbeforeunload = function(e){div_off("submenu");}
/* Disable the Search feature if we are not operating from CGI, since */
/* Search is accomplished using CGI and will not work without it. */
if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
document.getElementById("search_menubutton").style.display = "none";
}
/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
function hideorshow(btn,obj){
var x = document.getElementById(obj);
var b = document.getElementById(btn);
if( x.style.display!='none' ){
x.style.display = 'none';
b.innerHTML='show';
}else{
x.style.display = '';
b.innerHTML='hide';
}
return false;
}
var antiRobot = 0;
function antiRobotGo(){
if( antiRobot!=3 ) return;
antiRobot = 7;
var j = document.getElementById("mtimelink");
if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href");
}
function antiRobotDefense(){
document.body.onmousedown=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousedown=null;
}
document.body.onmousemove=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousemove=null;
}
setTimeout(function(){
antiRobot |= 1;
antiRobotGo();
}, 100)
antiRobotGo();
}
antiRobotDefense();
</script>
<div class=fancy>
<div class=nosearch>
<div class="fancy_title">
An Introduction To The SQLite C/C++ Interface
</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="#summary">1. Summary</a></div>
<div class="fancy-toc1"><a href="#introduction">2. Introduction</a></div>
<div class="fancy-toc1"><a href="#core_objects_and_interfaces">3. Core Objects And Interfaces</a></div>
<div class="fancy-toc1"><a href="#typical_usage_of_core_routines_and_objects">4. Typical Usage Of Core Routines And Objects</a></div>
<div class="fancy-toc1"><a href="#convenience_wrappers_around_core_routines">5. Convenience Wrappers Around Core Routines</a></div>
<div class="fancy-toc1"><a href="#binding_parameters_and_reusing_prepared_statements">6. Binding Parameters and Reusing Prepared Statements</a></div>
<div class="fancy-toc1"><a href="#configuring_sqlite">7. Configuring SQLite</a></div>
<div class="fancy-toc1"><a href="#extending_sqlite">8. Extending SQLite</a></div>
<div class="fancy-toc1"><a href="#other_interfaces">9. Other Interfaces</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="summary"><span>1. </span>Summary</h1>
<p>The following two objects and eight methods comprise the essential
elements of the SQLite interface:
</p><ul>
<li><p><b><a href="c3ref/sqlite3.html">sqlite3</a></b> →
The database connection object. Created by
<a href="c3ref/open.html">sqlite3_open()</a> and destroyed by <a href="c3ref/close.html">sqlite3_close()</a>.
</p></li><li><p><b><a href="c3ref/stmt.html">sqlite3_stmt</a></b> →
The prepared statement object. Created by
<a href="c3ref/prepare.html">sqlite3_prepare()</a> and destroyed by <a href="c3ref/finalize.html">sqlite3_finalize()</a>.
</p></li><li><p><b><a href="c3ref/open.html">sqlite3_open()</a></b> →
Open a connection to a new or existing SQLite database.
The constructor for <a href="c3ref/sqlite3.html">sqlite3</a>.
</p></li><li><p><b><a href="c3ref/prepare.html">sqlite3_prepare()</a></b> →
Compile SQL text into
byte-code that will do the work of querying or updating the database.
The constructor for <a href="c3ref/stmt.html">sqlite3_stmt</a>.
</p></li><li><p><b><a href="c3ref/bind_blob.html">sqlite3_bind()</a></b> →
Store application data into
<a href="lang_expr.html#varparam">parameters</a> of the original SQL.
</p></li><li><p><b><a href="c3ref/step.html">sqlite3_step()</a></b> →
Advance an <a href="c3ref/stmt.html">sqlite3_stmt</a> to the next result row or to completion.
</p></li><li><p><b><a href="c3ref/column_blob.html">sqlite3_column()</a></b> →
Column values in the current result row for an <a href="c3ref/stmt.html">sqlite3_stmt</a>.
</p></li><li><p><b><a href="c3ref/finalize.html">sqlite3_finalize()</a></b> →
Destructor for <a href="c3ref/stmt.html">sqlite3_stmt</a>.
</p></li><li><p><b><a href="c3ref/close.html">sqlite3_close()</a></b> →
Destructor for <a href="c3ref/sqlite3.html">sqlite3</a>.
</p></li><li><p><b><a href="c3ref/exec.html">sqlite3_exec()</a></b> →
A wrapper function that does <a href="c3ref/prepare.html">sqlite3_prepare()</a>, <a href="c3ref/step.html">sqlite3_step()</a>,
<a href="c3ref/column_blob.html">sqlite3_column()</a>, and <a href="c3ref/finalize.html">sqlite3_finalize()</a> for
a string of one or more SQL statements.
</p></li></ul>
<h1 id="introduction"><span>2. </span>Introduction</h1>
<p>
SQLite has more than 225 APIs.
However, most of the APIs are optional and very specialized
and can be ignored by beginners.
The core API is small, simple, and easy to learn.
This article summarizes the core API.
</p>
<p>
A separate document, <a href="c3ref/intro.html">The SQLite C/C++ Interface</a>,
provides detailed
specifications for all C/C++ APIs for SQLite. Once
the reader
understands the basic principles of operation for SQLite,
<a href="c3ref/intro.html">that document</a> should be used as a reference
guide. This article is intended as introduction only and is neither a
complete nor authoritative reference for the SQLite API.
</p>
<h1 id="core_objects_and_interfaces"><span>3. </span>Core Objects And Interfaces</h1>
<p>
The principal task of an SQL database engine is to evaluate SQL statements
of SQL. To accomplish this, the developer needs two objects:
</p>
<p></p><ul>
<li> The <a href="c3ref/sqlite3.html">database connection</a> object: sqlite3 </li>
<li> The <a href="c3ref/stmt.html">prepared statement</a> object: sqlite3_stmt </li>
</ul>
<p>
Strictly speaking, the <a href="c3ref/stmt.html">prepared statement</a> object is not required since
the convenience wrapper interfaces, <a href="c3ref/exec.html">sqlite3_exec</a> or
<a href="c3ref/free_table.html">sqlite3_get_table</a>, can be used and these convenience wrappers
encapsulate and hide the <a href="c3ref/stmt.html">prepared statement</a> object.
Nevertheless, an understanding of
<a href="c3ref/stmt.html">prepared statements</a> is needed to make full use of SQLite.
</p>
<p>
The <a href="c3ref/sqlite3.html">database connection</a> and <a href="c3ref/stmt.html">prepared statement</a> objects are controlled
by a small set of C/C++ interface routine listed below.
</p>
<p></p><ul>
<li> <a href="c3ref/open.html">sqlite3_open()</a> </li>
<li> <a href="c3ref/prepare.html">sqlite3_prepare()</a> </li>
<li> <a href="c3ref/step.html">sqlite3_step()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column()</a> </li>
<li> <a href="c3ref/finalize.html">sqlite3_finalize()</a> </li>
<li> <a href="c3ref/close.html">sqlite3_close()</a> </li>
</ul>
<p>
Note that the list of routines above is conceptual rather than actual.
Many of these routines come in multiple versions.
For example, the list above shows a single routine
named <a href="c3ref/open.html">sqlite3_open()</a> when in fact there are three separate routines
that accomplish the same thing in slightly different ways:
<a href="c3ref/open.html">sqlite3_open()</a>, <a href="c3ref/open.html">sqlite3_open16()</a> and <a href="c3ref/open.html">sqlite3_open_v2()</a>.
The list mentions <a href="c3ref/column_blob.html">sqlite3_column()</a>
when in fact no such routine exists.
The "sqlite3_column()" shown in the list is a placeholder for
an entire family of routines that extract column
data in various datatypes.
</p>
<p>
Here is a summary of what the core interfaces do:
</p>
<ul>
<li><p><b><a href="c3ref/open.html">sqlite3_open()</a></b>
</p><p>
This routine
opens a connection to an SQLite database file and returns a
<a href="c3ref/sqlite3.html">database connection</a> object. This is often the first SQLite API
call that an application makes and is a prerequisite for most other
SQLite APIs. Many SQLite interfaces require a pointer to
the <a href="c3ref/sqlite3.html">database connection</a> object as their first parameter and can
be thought of as methods on the <a href="c3ref/sqlite3.html">database connection</a> object.
This routine is the constructor for the <a href="c3ref/sqlite3.html">database connection</a> object.
</p>
</li><li><p><b><a href="c3ref/prepare.html">sqlite3_prepare()</a></b>
</p><p>
This routine
converts SQL text into a <a href="c3ref/stmt.html">prepared statement</a> object and returns a pointer
to that object. This interface requires a <a href="c3ref/sqlite3.html">database connection</a> pointer
created by a prior call to <a href="c3ref/open.html">sqlite3_open()</a> and a text string containing
the SQL statement to be prepared. This API does not actually evaluate
the SQL statement. It merely prepares the SQL statement for evaluation.
</p><p>Think of each SQL statement as a small computer program. The purpose
of <a href="c3ref/prepare.html">sqlite3_prepare()</a> is to compile that program into object code.
The <a href="c3ref/stmt.html">prepared statement</a> is the object code. The <a href="c3ref/step.html">sqlite3_step()</a> interface
then runs the object code to get a result.
</p><p>New applications should always invoke <a href="c3ref/prepare.html">sqlite3_prepare_v2()</a> instead
of <a href="c3ref/prepare.html">sqlite3_prepare()</a>. The older <a href="c3ref/prepare.html">sqlite3_prepare()</a> is retained for
backwards compatibility. But <a href="c3ref/prepare.html">sqlite3_prepare_v2()</a> provides a much
better interface.</p>
</li><li><p><b><a href="c3ref/step.html">sqlite3_step()</a></b>
</p><p>
This routine is used to evaluate a <a href="c3ref/stmt.html">prepared statement</a> that has been
previously created by the <a href="c3ref/prepare.html">sqlite3_prepare()</a> interface. The statement
is evaluated up to the point where the first row of results are available.
To advance to the second row of results, invoke <a href="c3ref/step.html">sqlite3_step()</a> again.
Continue invoking <a href="c3ref/step.html">sqlite3_step()</a> until the statement is complete.
Statements that do not return results (ex: INSERT, UPDATE, or DELETE
statements) run to completion on a single call to <a href="c3ref/step.html">sqlite3_step()</a>.
</p></li><li><p><b><a href="c3ref/column_blob.html">sqlite3_column()</a></b>
</p><p>
This routine returns a single column from the current row of a result
set for a <a href="c3ref/stmt.html">prepared statement</a> that is being evaluated by <a href="c3ref/step.html">sqlite3_step()</a>.
Each time <a href="c3ref/step.html">sqlite3_step()</a> stops with a new result set row, this routine
can be called multiple times to find the values of all columns in that row.
</p><p>As noted above, there really is no such thing as a "sqlite3_column()"
function in the SQLite API. Instead, what we here call "sqlite3_column()"
is a place-holder for an entire family of functions that return
a value from the result set in various data types. There are also routines
in this family that return the size of the result (if it is a string or
BLOB) and the number of columns in the result set.
</p><p></p><ul>
<li> <a href="c3ref/column_blob.html">sqlite3_column_blob()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_bytes()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_bytes16()</a> </li>
<li> <a href="c3ref/column_count.html">sqlite3_column_count()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_double()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_int()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_int64()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_text()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_text16()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_type()</a> </li>
<li> <a href="c3ref/column_blob.html">sqlite3_column_value()</a> </li>
</ul>
</li><li><p><b><a href="c3ref/finalize.html">sqlite3_finalize()</a></b>
</p><p>
This routine destroys a <a href="c3ref/stmt.html">prepared statement</a> created by a prior call
to <a href="c3ref/prepare.html">sqlite3_prepare()</a>. Every prepared statement must be destroyed using
a call to this routine in order to avoid memory leaks.
</p></li><li><p><b><a href="c3ref/close.html">sqlite3_close()</a></b>
</p><p>
This routine closes a <a href="c3ref/sqlite3.html">database connection</a> previously opened by a call
to <a href="c3ref/open.html">sqlite3_open()</a>. All <a href="c3ref/stmt.html">prepared statements</a> associated with the
connection should be <a href="c3ref/finalize.html">finalized</a> prior to closing the
connection.
</p></li></ul>
<h1 id="typical_usage_of_core_routines_and_objects"><span>4. </span>Typical Usage Of Core Routines And Objects</h1>
<p>
An application will typically use
<a href="c3ref/open.html">sqlite3_open()</a> to create a single <a href="c3ref/sqlite3.html">database connection</a>
during initialization.
Note that <a href="c3ref/open.html">sqlite3_open()</a> can be used to either open existing database
files or to create and open new database files.
While many applications use only a single <a href="c3ref/sqlite3.html">database connection</a>, there is
no reason why an application cannot call <a href="c3ref/open.html">sqlite3_open()</a> multiple times
in order to open multiple <a href="c3ref/sqlite3.html">database connections</a> - either to the same
database or to different databases. Sometimes a multi-threaded application
will create separate <a href="c3ref/sqlite3.html">database connections</a> for each thread.
Note that a single <a href="c3ref/sqlite3.html">database connection</a> can access two or more
databases using the <a href="lang_attach.html">ATTACH</a> SQL command, so it is not necessary to
have a separate database connection for each database file.
</p>
<p>
Many applications destroy their <a href="c3ref/sqlite3.html">database connections</a> using calls to
<a href="c3ref/close.html">sqlite3_close()</a> at shutdown. Or, for example, an application that
uses SQLite as its <a href="appfileformat.html">application file format</a> might
open <a href="c3ref/sqlite3.html">database connections</a> in response to a File/Open menu action
and then destroy the corresponding <a href="c3ref/sqlite3.html">database connection</a> in response
to the File/Close menu.
</p>
<p>
To run an SQL statement, the application follows these steps:
</p>
<p></p><ol>
<li> Create a <a href="c3ref/stmt.html">prepared statement</a> using <a href="c3ref/prepare.html">sqlite3_prepare()</a>. </li>
<li> Evaluate the <a href="c3ref/stmt.html">prepared statement</a> by calling <a href="c3ref/step.html">sqlite3_step()</a> one
or more times. </li>
<li> For queries, extract results by calling
<a href="c3ref/column_blob.html">sqlite3_column()</a> in between
two calls to <a href="c3ref/step.html">sqlite3_step()</a>. </li>
<li> Destroy the <a href="c3ref/stmt.html">prepared statement</a> using <a href="c3ref/finalize.html">sqlite3_finalize()</a>. </li>
</ol>
<p>
The foregoing is all one really needs to know in order to use SQLite
effectively. All the rest is optimization and detail.
</p>
<h1 id="convenience_wrappers_around_core_routines"><span>5. </span>Convenience Wrappers Around Core Routines</h1>
<p>
The <a href="c3ref/exec.html">sqlite3_exec()</a> interface is a convenience wrapper that carries out
all four of the above steps with a single function call. A callback
function passed into <a href="c3ref/exec.html">sqlite3_exec()</a> is used to process each row of
the result set. The <a href="c3ref/free_table.html">sqlite3_get_table()</a> is another convenience wrapper
that does all four of the above steps. The <a href="c3ref/free_table.html">sqlite3_get_table()</a> interface
differs from <a href="c3ref/exec.html">sqlite3_exec()</a> in that it stores the results of queries
in heap memory rather than invoking a callback.
</p>
<p>
It is important to realize that neither <a href="c3ref/exec.html">sqlite3_exec()</a> nor
<a href="c3ref/free_table.html">sqlite3_get_table()</a> do anything that cannot be accomplished using
the core routines. In fact, these wrappers are implemented purely in
terms of the core routines.
</p>
<h1 id="binding_parameters_and_reusing_prepared_statements"><span>6. </span>Binding Parameters and Reusing Prepared Statements</h1>
<p>
In prior discussion, it was assumed that each SQL statement is prepared
once, evaluated, then destroyed. However, SQLite allows the same
<a href="c3ref/stmt.html">prepared statement</a> to be evaluated multiple times. This is accomplished
using the following routines:
</p>
<p></p><ul>
<li> <a href="c3ref/reset.html">sqlite3_reset()</a> </li>
<li> <a href="c3ref/bind_blob.html">sqlite3_bind()</a> </li>
</ul>
<p>
After a <a href="c3ref/stmt.html">prepared statement</a> has been evaluated by one or more calls to
<a href="c3ref/step.html">sqlite3_step()</a>, it can be reset in order to be evaluated again by a
call to <a href="c3ref/reset.html">sqlite3_reset()</a>.
Think of <a href="c3ref/reset.html">sqlite3_reset()</a> as rewinding the <a href="c3ref/stmt.html">prepared statement</a> program
back to the beginning.
Using <a href="c3ref/reset.html">sqlite3_reset()</a> on an existing <a href="c3ref/stmt.html">prepared statement</a> rather than
creating a new <a href="c3ref/stmt.html">prepared statement</a> avoids unnecessary calls to
<a href="c3ref/prepare.html">sqlite3_prepare()</a>.
For many SQL statements, the time needed
to run <a href="c3ref/prepare.html">sqlite3_prepare()</a> equals or exceeds the time needed by
<a href="c3ref/step.html">sqlite3_step()</a>. So avoiding calls to <a href="c3ref/prepare.html">sqlite3_prepare()</a> can give
a significant performance improvement.
</p>
<p>
It is not commonly useful to evaluate the <em>exact</em> same SQL
statement more than once. More often, one wants to evaluate similar
statements. For example, you might want to evaluate an INSERT statement
multiple times with different values. Or you might want to evaluate
the same query multiple times using a different key in the WHERE clause.
To accommodate
this, SQLite allows SQL statements to contain <a href="lang_expr.html#varparam">parameters</a>
which are "bound" to values prior to being evaluated. These values can
later be changed and the same <a href="c3ref/stmt.html">prepared statement</a> can be evaluated
a second time using the new values.
</p>
<p>
SQLite allows a <a href="lang_expr.html#varparam">parameter</a> wherever a string literal,
blob literal, numeric constant, or NULL is allowed
in queries or data modification statements. (DQL or DML)
(Parameters may not be used for column or table names,
or as values for constraints or default values. (DDL))
A <a href="lang_expr.html#varparam">parameter</a> takes one of the following forms:
</p>
<p></p><ul>
<li> <b>?</b> </li>
<li> <b>?</b><i>NNN</i> </li>
<li> <b>:</b><i>AAA</i> </li>
<li> <b>$</b><i>AAA</i> </li>
<li> <b>@</b><i>AAA</i> </li>
</ul>
<p>
In the examples above, <i>NNN</i> is an integer value and
<i>AAA</i> is an identifier.
A parameter initially has a value of NULL.
Prior to calling <a href="c3ref/step.html">sqlite3_step()</a> for the first time or immediately
after <a href="c3ref/reset.html">sqlite3_reset()</a>, the application can invoke the
<a href="c3ref/bind_blob.html">sqlite3_bind()</a> interfaces to attach values
to the parameters. Each call to <a href="c3ref/bind_blob.html">sqlite3_bind()</a>
overrides prior bindings on the same parameter.
</p>
<p>
An application is allowed to prepare multiple SQL statements in advance
and evaluate them as needed.
There is no arbitrary limit to the number of outstanding
<a href="c3ref/stmt.html">prepared statements</a>.
Some applications call <a href="c3ref/prepare.html">sqlite3_prepare()</a> multiple times at start-up to
create all of the <a href="c3ref/stmt.html">prepared statements</a> they will ever need. Other
applications keep a cache of the most recently used <a href="c3ref/stmt.html">prepared statements</a>
and then reuse <a href="c3ref/stmt.html">prepared statements</a> out of the cache when available.
Another approach is to only reuse <a href="c3ref/stmt.html">prepared statements</a> when they are
inside of a loop.
</p>
<h1 id="configuring_sqlite"><span>7. </span>Configuring SQLite</h1>
<p>
The default configuration for SQLite works great for most applications.
But sometimes developers want to tweak the setup to try to squeeze out
a little more performance, or take advantage of some obscure feature.
</p><p>
The <a href="c3ref/config.html">sqlite3_config()</a> interface is used to make global, process-wide
configuration changes for SQLite. The <a href="c3ref/config.html">sqlite3_config()</a> interface must
be called before any <a href="c3ref/sqlite3.html">database connections</a> are created. The
<a href="c3ref/config.html">sqlite3_config()</a> interface allows the programmer to do things like:
</p><ul>
<li>Adjust how SQLite does <a href="malloc.html">memory allocation</a>, including setting up
alternative memory allocators appropriate for safety-critical
real-time embedded systems and application-defined memory allocators.
</li><li>Set up a process-wide <a href="errlog.html">error log</a>.
</li><li>Specify an application-defined page cache.
</li><li>Adjust the use of mutexes so that they are appropriate for various
<a href="threadsafe.html">threading models</a>, or substitute an
application-defined mutex system.
</li></ul>
<p>
After process-wide configuration is complete and <a href="c3ref/sqlite3.html">database connections</a>
have been created, individual database connections can be configured using
calls to <a href="c3ref/limit.html">sqlite3_limit()</a> and <a href="c3ref/db_config.html">sqlite3_db_config()</a>.
</p><h1 id="extending_sqlite"><span>8. </span>Extending SQLite</h1>
<p>
SQLite includes interfaces that can be used to extend its functionality.
Such routines include:
</p>
<p></p><ul>
<li> <a href="c3ref/create_collation.html">sqlite3_create_collation()</a> </li>
<li> <a href="c3ref/create_function.html">sqlite3_create_function()</a> </li>
<li> <a href="c3ref/create_module.html">sqlite3_create_module()</a> </li>
<li> <a href="c3ref/vfs_find.html">sqlite3_vfs_register()</a> </li>
</ul>
<p>
The <a href="c3ref/create_collation.html">sqlite3_create_collation()</a> interface is used to create new
<a href="datatype3.html#collation">collating sequences</a> for sorting text.
The <a href="c3ref/create_module.html">sqlite3_create_module()</a> interface is used to register new
<a href="vtab.html">virtual table</a> implementations.
The <a href="c3ref/vfs_find.html">sqlite3_vfs_register()</a> interface creates new <a href="vfs.html">VFSes</a>.
</p>
<p>
The <a href="c3ref/create_function.html">sqlite3_create_function()</a> interface creates new SQL functions -
either scalar or aggregate. The new function implementation typically
makes use of the following additional interfaces:
</p>
<p></p><ul>
<li> <a href="c3ref/aggregate_context.html">sqlite3_aggregate_context()</a> </li>
<li> <a href="c3ref/result_blob.html">sqlite3_result()</a> </li>
<li> <a href="c3ref/user_data.html">sqlite3_user_data()</a> </li>
<li> <a href="c3ref/value_blob.html">sqlite3_value()</a> </li>
</ul>
<p>
All of the built-in SQL functions of SQLite are created using exactly
these same interfaces. Refer to the SQLite source code, and in particular
the
<a href="https://www.sqlite.org/src/doc/trunk/src/date.c">date.c</a> and
<a href="https://www.sqlite.org/src/doc/trunk/src/func.c">func.c</a> source files
for examples.
</p>
<p>
Shared libraries or DLLs can be used as <a href="loadext.html">loadable extensions</a> to SQLite.
</p><h1 id="other_interfaces"><span>9. </span>Other Interfaces</h1>
<p>
This article only mentions the most important and most commonly
used SQLite interfaces.
The SQLite library includes many other APIs implementing useful
features that are not described here.
A <a href="c3ref/funclist.html">complete list of functions</a> that form the SQLite
application programming interface is found at the
<a href="c3ref/intro.html">C/C++ Interface Specification</a>.
Refer to that document for complete and authoritative information about
all SQLite interfaces.
</p>
|