diff options
Diffstat (limited to 'www/np1queryprob.html')
-rw-r--r-- | www/np1queryprob.html | 516 |
1 files changed, 516 insertions, 0 deletions
diff --git a/www/np1queryprob.html b/www/np1queryprob.html new file mode 100644 index 0000000..cf12203 --- /dev/null +++ b/www/np1queryprob.html @@ -0,0 +1,516 @@ +<!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>Many Small Queries Are Efficient In SQLite</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"> +Many Small Queries Are Efficient In SQLite +</div> +</div> + + + + + +<h1 id="executive_summary"><span>1. </span>Executive Summary</h1> + +<ul> +<li><p> +200 SQL statements per webpage is excessive for client/server database +engines like MySQL, PostgreSQL, or SQL Server. + +</p></li><li><p> +But with SQLite, 200 or more SQL statement per webpage is not a problem. + +</p></li><li><p> +SQLite can also do large and complex queries efficiently, just like +client/server databases. But SQLite can do many smaller queries +efficiently too. Application developers can use whichever technique +works best for the task at hand. + +</p></li></ul> + +<h1 id="the_perceived_problem"><span>2. </span>The Perceived Problem</h1> + +<p> +The <a href="whentouse.html#website">Appropriate Uses For SQLite</a> page says that +dynamic pages on the SQLite website typically do about 200 SQL +statements each. +This has provoked criticism from readers. Examples: + +</p><ul> +<li><p> +<i>"200 SQL statements is a ridiculously high number for a single page"</i> +</p></li><li><p> +<i>"For most sites, 200 queries is way, way, way too much."</i> +</p></li><li><p> +<i>"[This is] bad design"</i> +</p></li></ul> + +<p> +Such criticism would be well-founded for a traditional client/server +database engine, such as MySQL, PostgreSQL, or SQL Server. In +a client/server database, each SQL statement requires a message +round-trip from the application to the database server and back to +the application. Doing over 200 round-trip messages, sequentially, +can be a serious performance drag. This is sometimes called the +"N+1 Query Problem" or the "N+1 Select Problem" and it is an anti-pattern. + +</p><h1 id="n_1_queries_are_not_a_problem_with_sqlite"><span>3. </span>N+1 Queries Are Not A Problem With SQLite</h1> + +<p> +SQLite is <u>not</u> client/server, however. The SQLite database runs +in the same process address space as the application. Queries do not +involve message round-trips, only a function call. The latency +of a single SQL query is far less in SQLite. Hence, using a large number +of queries with SQLite is not the problem. + +</p><h1 id="the_need_for_over_200_sql_statements_per_webpage"><span>4. </span>The Need For Over 200 SQL Statements Per Webpage</h1> + +<p> +The dynamic webpages on the SQLite website are mostly generated by +the <a href="https://www.fossil-scm.org/">Fossil version control system</a>. +A typical dynamic +page would be a timeline such as <a href="https://www.sqlite.org/src/timeline">https://www.sqlite.org/src/timeline</a>. +A log of all SQL used by the timeline is shown below. + +</p><p> +The first group of queries in the log are extracting display options +from the "config" and "global_config" tables of the Fossil database. +Then there is a single complex query that extracts a list of all elements +to be displayed on the timeline. +This "timeline" query demonstrates that SQLite can easily process complex +relational database queries involving multiple tables, subqueries, and +complex WHERE clause constraints, and it can make effective use of indexes +to solve the queries with minimal disk I/O. + +</p><p> +Following the single big "timeline" query, +there are additional queries for each timeline element. +Fossil is using the "N+1 Query" pattern rather than trying +to grab all the information in as few queries as possible. +But that is ok because there is no unnecessary IPC overhead. +At the bottom of +each timeline page, Fossil shows approximately how long it took to generate +the page. For a 50-entry timeline, the latency is usually less than +25 milliseconds. Profiling shows that few of those milliseconds +were spent inside the database engine. + +</p><p> +Using the N+1 Query pattern in Fossil does not harm the application. +But the N+1 Query pattern does have benefits. For one, the +section of the code that creates the timeline query can be +completely separate from the section that prepares each timeline +entry for display. +This provides a separation of responsibility that helps keep the code +simple and easy to maintain. Secondly, the information +needed for display, and the queries needed to extract that information, +vary according to what type of objects to be shown. Check-ins need one +set of queries. Tickets need another set of queries. Wiki pages need a +different query. And so forth. By implementing these queries on-demand +and in the part of the code dealing with the various entities, there is +further separation of responsibility and simplification of the overall +code base. + +</p><p> +So, SQLite is able to do one or two large and complex queries, or it can +do many smaller and simpler queries. Both are efficient. An application +can use either or both techniques, depending on what works best for the +situation at hand. + +</p><p> +The following is a log of all SQL used to generate one particular +timeline (captured on 2016-09-16): + +</p><div class="codeblock"><pre>-- sqlite3_open: /home/drh/sqlite/sqlite/.fslckout +PRAGMA foreign_keys=OFF; +SELECT sql FROM localdb.sqlite_schema WHERE name=='vfile'; +-- sqlite3_open: /home/drh/.fossil +PRAGMA foreign_keys=OFF; +SELECT value FROM vvar WHERE name='repository'; +ATTACH DATABASE '/home/drh/www/repos/sqlite.fossil' AS 'repository' KEY ''; +SELECT value FROM config WHERE name='allow-symlinks'; +SELECT value FROM global_config WHERE name='allow-symlinks'; +SELECT value FROM config WHERE name='aux-schema'; +SELECT 1 FROM config WHERE name='baseurl:http://'; +SELECT value FROM config WHERE name='ip-prefix-terms'; +SELECT value FROM global_config WHERE name='ip-prefix-terms'; +SELECT value FROM config WHERE name='localauth'; +SELECT value FROM vvar WHERE name='default-user'; +SELECT uid FROM user WHERE cap LIKE '%s%'; +SELECT login FROM user WHERE uid=1; +SELECT cap FROM user WHERE login = 'nobody'; +SELECT cap FROM user WHERE login = 'anonymous'; +SELECT value FROM config WHERE name='public-pages'; +SELECT value FROM global_config WHERE name='public-pages'; +SELECT value FROM config WHERE name='header'; +SELECT value FROM config WHERE name='project-name'; +SELECT value FROM config WHERE name='th1-setup'; +SELECT value FROM global_config WHERE name='th1-setup'; +SELECT value FROM config WHERE name='redirect-to-https'; +SELECT value FROM global_config WHERE name='redirect-to-https'; +SELECT value FROM config WHERE name='index-page'; +SELECT mtime FROM config WHERE name='css'; +SELECT mtime FROM config WHERE name='logo-image'; +SELECT mtime FROM config WHERE name='background-image'; +CREATE TEMP TABLE IF NOT EXISTS timeline( + rid INTEGER PRIMARY KEY, + uuid TEXT, + timestamp TEXT, + comment TEXT, + user TEXT, + isleaf BOOLEAN, + bgcolor TEXT, + etype TEXT, + taglist TEXT, + tagid INTEGER, + short TEXT, + sortby REAL +) +; +INSERT OR IGNORE INTO timeline SELECT + blob.rid AS blobRid, + uuid AS uuid, + datetime(event.mtime,toLocal()) AS timestamp, + coalesce(ecomment, comment) AS comment, + coalesce(euser, user) AS user, + blob.rid IN leaf AS leaf, + bgcolor AS bgColor, + event.type AS eventType, + (SELECT group_concat(substr(tagname,5), ', ') FROM tag, tagxref + WHERE tagname GLOB 'sym-*' AND tag.tagid=tagxref.tagid + AND tagxref.rid=blob.rid AND tagxref.tagtype>0) AS tags, + tagid AS tagid, + brief AS brief, + event.mtime AS mtime + FROM event CROSS JOIN blob +WHERE blob.rid=event.objid + AND NOT EXISTS(SELECT 1 FROM tagxref WHERE tagid=5 AND tagtype>0 AND rid=blob.rid) + ORDER BY event.mtime DESC LIMIT 50; +-- SELECT value FROM config WHERE name='timeline-utc'; +SELECT count(*) FROM timeline WHERE etype!='div'; +SELECT min(timestamp) FROM timeline; +SELECT julianday('2016-09-15 14:54:51',fromLocal()); +SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime<=2457647.121412037); +SELECT max(timestamp) FROM timeline; +SELECT julianday('2016-09-24 17:42:43',fromLocal()); +SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime>=2457656.238009259); +SELECT value FROM config WHERE name='search-ci'; +SELECT value FROM vvar WHERE name='checkout'; +SELECT value FROM config WHERE name='timeline-max-comment'; +SELECT value FROM global_config WHERE name='timeline-max-comment'; +SELECT value FROM config WHERE name='timeline-date-format'; +SELECT value FROM config WHERE name='timeline-truncate-at-blank'; +SELECT value FROM global_config WHERE name='timeline-truncate-at-blank'; +SELECT * FROM timeline ORDER BY sortby DESC; +SELECT value FROM config WHERE name='hash-digits'; +SELECT value FROM global_config WHERE name='hash-digits'; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68028; +SELECT pid FROM plink WHERE cid=68028 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM tagxref WHERE rid=68028 AND tagid=9 AND tagtype>0; +SELECT value FROM config WHERE name='timeline-block-markup'; +SELECT value FROM config WHERE name='timeline-plaintext'; +SELECT value FROM config WHERE name='wiki-use-html'; +SELECT value FROM global_config WHERE name='wiki-use-html'; +SELECT 1 FROM private WHERE rid=68028; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68026; +SELECT pid FROM plink WHERE cid=68026 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68026; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68024; +SELECT pid FROM plink WHERE cid=68024 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68024; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68018; +SELECT pid FROM plink WHERE cid=68018 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68018; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68012; +SELECT pid FROM plink WHERE cid=68012 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68012; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68011; +SELECT value FROM config WHERE name='details'; +SELECT pid FROM plink WHERE cid=68011 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM tagxref WHERE rid=68011 AND tagid=9 AND tagtype>0; +SELECT 1 FROM private WHERE rid=68011; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68008; +SELECT pid FROM plink WHERE cid=68008 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68008; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68006; +SELECT pid FROM plink WHERE cid=68006 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68006; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=68000; +SELECT pid FROM plink WHERE cid=68000 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=68000; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67997; +SELECT pid FROM plink WHERE cid=67997 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67997; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67992; +SELECT pid FROM plink WHERE cid=67992 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67992; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67990; +SELECT pid FROM plink WHERE cid=67990 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67990; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67989; +SELECT pid FROM plink WHERE cid=67989 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67989; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67984; +SELECT pid FROM plink WHERE cid=67984 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67984; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67983; +SELECT pid FROM plink WHERE cid=67983 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67983; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67979; +SELECT pid FROM plink WHERE cid=67979 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67979; +SELECT value FROM config WHERE name='ticket-closed-expr'; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='1ec41379c9c1e400' AND tkt_uuid<'1ec41379c9c1e401'; +SELECT 1 FROM private WHERE rid=67980; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67977; +SELECT pid FROM plink WHERE cid=67977 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='1ec41379c9c1e400' AND tkt_uuid<'1ec41379c9c1e401'; +SELECT 1 FROM private WHERE rid=67977; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='1ec41379c9c1e400' AND tkt_uuid<'1ec41379c9c1e401'; +SELECT 1 FROM private WHERE rid=67974; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67971; +SELECT pid FROM plink WHERE cid=67971 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67971; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67972; +SELECT pid FROM plink WHERE cid=67972 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67972; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67969; +SELECT pid FROM plink WHERE cid=67969 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67969; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67966; +SELECT pid FROM plink WHERE cid=67966 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67966; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67962; +SELECT pid FROM plink WHERE cid=67962 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67962; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67960; +SELECT pid FROM plink WHERE cid=67960 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67960; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67957; +SELECT pid FROM plink WHERE cid=67957 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67957; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67955; +SELECT pid FROM plink WHERE cid=67955 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67955; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67953; +SELECT pid FROM plink WHERE cid=67953 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='5990a1bdb4a073' AND tkt_uuid<'5990a1bdb4a074'; +SELECT 1 FROM blob WHERE uuid>='5990a1bdb4a073' AND uuid<'5990a1bdb4a074'; +SELECT 1 FROM private WHERE rid=67953; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67941; +SELECT pid FROM plink WHERE cid=67941 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67941; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67940; +SELECT pid FROM plink WHERE cid=67940 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67940; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67938; +SELECT pid FROM plink WHERE cid=67938 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67938; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67935; +SELECT pid FROM plink WHERE cid=67935 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67935; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67934; +SELECT pid FROM plink WHERE cid=67934 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67934; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67932; +SELECT pid FROM plink WHERE cid=67932 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67932; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67930; +SELECT pid FROM plink WHERE cid=67930 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67930; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67928; +SELECT pid FROM plink WHERE cid=67928 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM tagxref WHERE rid=67928 AND tagid=9 AND tagtype>0; +SELECT 1 FROM private WHERE rid=67928; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='0eab1ac7591f511d' AND tkt_uuid<'0eab1ac7591f511e'; +SELECT 1 FROM private WHERE rid=67919; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='01874d252ac44861' AND tkt_uuid<'01874d252ac44862'; +SELECT 1 FROM blob WHERE uuid>='01874d252ac44861' AND uuid<'01874d252ac44862'; +SELECT 1 FROM private WHERE rid=67918; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67916; +SELECT pid FROM plink WHERE cid=67916 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='0eab1ac759' AND tkt_uuid<'0eab1ac75:'; +SELECT 1 FROM private WHERE rid=67916; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='a49bc0a8244feb08' AND tkt_uuid<'a49bc0a8244feb09'; +SELECT 1 FROM blob WHERE uuid>='a49bc0a8244feb08' AND uuid<'a49bc0a8244feb09'; +SELECT 1 FROM private WHERE rid=67914; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67913; +SELECT pid FROM plink WHERE cid=67913 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='0eab1ac7591f' AND tkt_uuid<'0eab1ac7591g'; +SELECT 1 FROM private WHERE rid=67913; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67911; +SELECT pid FROM plink WHERE cid=67911 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67911; +SELECT status='Closed' OR status='Fixed' FROM ticket WHERE tkt_uuid>='0eab1ac7591f511d' AND tkt_uuid<'0eab1ac7591f511e'; +SELECT 1 FROM private WHERE rid=67909; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67907; +SELECT pid FROM plink WHERE cid=67907 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67907; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67899; +SELECT pid FROM plink WHERE cid=67899 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67899; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67897; +SELECT pid FROM plink WHERE cid=67897 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67897; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67895; +SELECT pid FROM plink WHERE cid=67895 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67895; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67893; +SELECT pid FROM plink WHERE cid=67893 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67893; +SELECT value FROM tagxref WHERE tagid=8 AND tagtype>0 AND rid=67891; +SELECT pid FROM plink WHERE cid=67891 AND pid NOT IN phantom ORDER BY isprim DESC; +SELECT 1 FROM private WHERE rid=67891; +SELECT count(*) FROM plink + WHERE pid=67928 AND isprim + AND coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.pid), 'trunk') + =coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.cid), 'trunk') +; +SELECT count(*) FROM plink + WHERE pid=68011 AND isprim + AND coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.pid), 'trunk') + =coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.cid), 'trunk') +; +SELECT count(*) FROM plink + WHERE pid=68028 AND isprim + AND coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.pid), 'trunk') + =coalesce((SELECT value FROM tagxref + WHERE tagid=8 AND rid=plink.cid), 'trunk') +; +SELECT value FROM config WHERE name='show-version-diffs'; +SELECT value FROM config WHERE name='adunit-omit-if-admin'; +SELECT value FROM global_config WHERE name='adunit-omit-if-admin'; +SELECT value FROM config WHERE name='adunit-omit-if-user'; +SELECT value FROM global_config WHERE name='adunit-omit-if-user'; +SELECT value FROM config WHERE name='adunit'; +SELECT value FROM global_config WHERE name='adunit'; +SELECT value FROM config WHERE name='auto-hyperlink-delay'; +SELECT value FROM global_config WHERE name='auto-hyperlink-delay'; +SELECT value FROM config WHERE name='footer'; +PRAGMA database_list; +PRAGMA database_list; +PRAGMA localdb.freelist_count; +PRAGMA localdb.page_count; +</pre></div> +<p align="center"><small><i>This page last modified on <a href="https://sqlite.org/docsrc/honeypot" id="mtimelink" data-href="https://sqlite.org/docsrc/finfo/pages/np1queryprob.in?m=930ff1b89814b2162">2020-06-18 21:18:56</a> UTC </small></i></p> + |