<!DOCTYPE html><htmllang="en"><head><title>clients/base/sqlite3/grammar</title></head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"><metaname="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><metaname="groc-relative-root"content="../../../"><metaname="groc-document-path"content="clients/base/sqlite3/grammar"><metaname="groc-project-path"content="clients/base/sqlite3/grammar.js"><linkrel="stylesheet"type="text/css"media="all"href="../../../assets/style.css"><scripttype="text/javascript"src="../../../assets/behavior.js"></script><body><divid="meta"><divclass="file-path">clients/base/sqlite3/grammar.js</div></div><divid="document"><divclass="segment"><divclass="comments"><divclass="wrapper"><h2id="sqlite3-grammar">SQLite3 Grammar</h2></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The SQLite3 base is a bit different than the other clients,
layer to the prototype chain.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">_</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'lodash'</span><spanclass="p">);</span>
<spanclass="kd">var</span><spanclass="nx">baseGrammar</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'../grammar'</span><spanclass="p">).</span><spanclass="nx">baseGrammar</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Extends the standard sql grammar, with any SQLite specific
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile the "order by" portions of the query.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileOrders</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">,</span><spanclass="nx">orders</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s2">"order by "</span><spanclass="o">+</span><spanclass="nx">orders</span><spanclass="p">.</span><spanclass="nx">map</span><spanclass="p">(</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">order</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile an insert statement into SQL.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileInsert</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">columns</span><spanclass="o">=</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">pluck</span><spanclass="p">(</span><spanclass="nx">values</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">],</span><spanclass="mi">0</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If there are any "where" clauses, we need to omit
any bindings that may have been associated with them.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">.</span><spanclass="nx">wheres</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">></span><spanclass="mi">0</span><spanclass="p">)</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">clearWhereBindings</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If there is only one record being inserted, we will just use the usual query
row inserts in SQLite. However, if there are multiples, we'll continue.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">values</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">===</span><spanclass="mi">1</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">sql</span><spanclass="o">=</span><spanclass="s1">'insert into '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s1">''</span><spanclass="p">;</span>
<spanclass="kd">var</span><spanclass="nx">blocks</span><spanclass="o">=</span><spanclass="p">[];</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>SQLite requires us to build the multi-row insert as a listing of select with
unions joining them together. So we'll build out this list of columns and
then join them all together with select unions to complete the queries.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="kd">var</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">blocks</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'? as '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrap</span><spanclass="p">(</span><spanclass="nx">columns</span><spanclass="p">[</span><spanclass="nx">i</span><spanclass="p">]));</span>
<spanclass="k">return</span><spanclass="s2">"insert into "</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s2">" ("</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">columnize</span><spanclass="p">(</span><spanclass="nx">columns</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="s2">") select "</span><spanclass="o">+</span><spanclass="nx">blocks</span><spanclass="p">.</span><spanclass="nx">join</span><spanclass="p">(</span><spanclass="s1">' union all select '</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a truncate table statement into SQL.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileTruncate</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'delete from sqlite_sequence where name = '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="p">);</span>
<spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'delete from '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>For share and for update are not available in sqlite3.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileForUpdate</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{},</span>