mirror of
https://github.com/knex/knex.git
synced 2025-12-19 19:19:10 +00:00
86 lines
22 KiB
HTML
86 lines
22 KiB
HTML
<!DOCTYPE html><html lang="en"><head><title>lib/dialects/sqlite3/query</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../../../"><meta name="groc-document-path" content="lib/dialects/sqlite3/query"><meta name="groc-project-path" content="lib/dialects/sqlite3/query.js"><link rel="stylesheet" type="text/css" media="all" href="../../../assets/style.css"><script type="text/javascript" src="../../../assets/behavior.js"></script><body><div id="meta"><div class="file-path">lib/dialects/sqlite3/query.js</div></div><div id="document"><div class="segment"><div class="comments "><div class="wrapper"><h2 id="sqlite3-query-builder-amp-compiler">SQLite3 Query Builder & Compiler</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">)</span> <span class="p">{</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'lodash'</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">inherits</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'inherits'</span><span class="p">);</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">QueryBuilder</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../query/builder'</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">QueryCompiler</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../query/compiler'</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="query-builder">Query Builder</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">QueryBuilder_SQLite3</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">client</span> <span class="o">=</span> <span class="nx">client</span><span class="p">;</span>
|
|
<span class="nx">QueryBuilder</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">inherits</span><span class="p">(</span><span class="nx">QueryBuilder_SQLite3</span><span class="p">,</span> <span class="nx">QueryBuilder</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="query-compiler">Query Compiler</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">QueryCompiler_SQLite3</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">formatter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">client</span><span class="p">.</span><span class="nx">Formatter</span><span class="p">();</span>
|
|
<span class="nx">QueryCompiler</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">inherits</span><span class="p">(</span><span class="nx">QueryCompiler_SQLite3</span><span class="p">,</span> <span class="nx">QueryCompiler</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>The locks are not applicable in SQLite3</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">forShare</span> <span class="o">=</span>
|
|
<span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">forUpdate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">''</span><span class="p">;</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="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><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">insert</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">insert</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">insert</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">'insert into '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span> <span class="o">+</span> <span class="s1">' '</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">insert</span><span class="p">))</span> <span class="k">return</span> <span class="nx">sql</span> <span class="o">+</span> <span class="s1">'default values'</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">insertData</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_prepInsert</span><span class="p">(</span><span class="nx">insert</span><span class="p">);</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">'('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">insertData</span><span class="p">.</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">insertData</span><span class="p">.</span><span class="nx">values</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">sql</span> <span class="o">+</span> <span class="s1">' values ('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">insertData</span><span class="p">.</span><span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">var</span> <span class="nx">blocks</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">insertData</span><span class="p">.</span><span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">block</span> <span class="o">=</span> <span class="nx">blocks</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="kd">var</span> <span class="nx">current</span> <span class="o">=</span> <span class="nx">insertData</span><span class="p">.</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l2</span> <span class="o">=</span> <span class="nx">insertData</span><span class="p">.</span><span class="nx">columns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i2</span> <span class="o"><</span> <span class="nx">l2</span><span class="p">;</span> <span class="nx">i2</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">block</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">parameter</span><span class="p">(</span><span class="nx">current</span><span class="p">[</span><span class="nx">i2</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' as '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">insertData</span><span class="p">.</span><span class="nx">columns</span><span class="p">[</span><span class="nx">i2</span><span class="p">]));</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">blocks</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">block</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">sql</span> <span class="o">+</span> <span class="s1">' select '</span> <span class="o">+</span> <span class="nx">blocks</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' union all select '</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Adds a <code>order by</code> clause to the query, using "collate nocase" for the sort.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">order</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">orders</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">grouped</span><span class="p">.</span><span class="nx">order</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">orders</span><span class="p">)</span> <span class="k">return</span> <span class="s1">''</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">orders</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">order</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">cols</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">order</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="o">?</span> <span class="nx">order</span><span class="p">.</span><span class="nx">value</span> <span class="o">:</span> <span class="p">[</span><span class="nx">order</span><span class="p">.</span><span class="nx">value</span><span class="p">];</span>
|
|
<span class="k">return</span> <span class="s1">'order by '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">cols</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' collate nocase '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatter</span><span class="p">.</span><span class="nx">direction</span><span class="p">(</span><span class="nx">order</span><span class="p">.</span><span class="nx">direction</span><span class="p">);</span>
|
|
<span class="p">},</span> <span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compiles an <code>update</code> query.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">update</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">updateData</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_prepUpdate</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">update</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">joins</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">join</span><span class="p">();</span>
|
|
<span class="kd">var</span> <span class="nx">wheres</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">where</span><span class="p">();</span>
|
|
<span class="k">return</span> <span class="s1">'update '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span> <span class="o">+</span>
|
|
<span class="p">(</span><span class="nx">joins</span> <span class="o">?</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">joins</span> <span class="o">:</span> <span class="s1">''</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' set '</span> <span class="o">+</span> <span class="nx">updateData</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="p">(</span><span class="nx">wheres</span> <span class="o">?</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">wheres</span> <span class="o">:</span> <span class="s1">''</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compile a truncate table statement into SQL.</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">truncate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="p">{</span>
|
|
<span class="nx">sql</span><span class="o">:</span> <span class="s1">'delete from sqlite_sequence where name = '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">tableName</span><span class="p">,</span>
|
|
<span class="nx">output</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">query</span><span class="p">({</span><span class="nx">sql</span><span class="o">:</span> <span class="s1">'delete from '</span> <span class="o">+</span> <span class="nx">table</span><span class="p">});</span>
|
|
<span class="p">}</span>
|
|
<span class="p">};</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Compiles a <code>columnInfo</code> query</p></div></div><div class="code"><div class="wrapper"><span class="nx">QueryCompiler_SQLite3</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">columnInfo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="p">{</span>
|
|
<span class="nx">sql</span><span class="o">:</span> <span class="s1">'PRAGMA table_info('</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">single</span><span class="p">.</span><span class="nx">table</span> <span class="o">+</span><span class="s1">')'</span><span class="p">,</span>
|
|
<span class="nx">output</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">maxLengthRegex</span> <span class="o">=</span> <span class="sr">/.*\((\d+)\)/</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">resp</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">columns</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="nx">val</span><span class="p">.</span><span class="nx">type</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">maxLength</span> <span class="o">=</span> <span class="p">(</span><span class="nx">maxLength</span> <span class="o">=</span> <span class="nx">type</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">maxLengthRegex</span><span class="p">))</span> <span class="o">&&</span> <span class="nx">maxLength</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
|
|
<span class="nx">type</span> <span class="o">=</span> <span class="nx">maxLength</span> <span class="o">?</span> <span class="nx">type</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">'('</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">:</span> <span class="nx">type</span><span class="p">;</span>
|
|
<span class="nx">columns</span><span class="p">[</span><span class="nx">val</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="nx">type</span><span class="o">:</span> <span class="nx">type</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">(),</span>
|
|
<span class="nx">maxLength</span><span class="o">:</span> <span class="nx">maxLength</span><span class="p">,</span>
|
|
<span class="nx">nullable</span><span class="o">:</span> <span class="o">!</span><span class="nx">val</span><span class="p">.</span><span class="nx">notnull</span><span class="p">,</span>
|
|
<span class="nx">defaultValue</span><span class="o">:</span> <span class="nx">val</span><span class="p">.</span><span class="nx">dflt_value</span>
|
|
<span class="p">};</span>
|
|
<span class="k">return</span> <span class="nx">columns</span><span class="p">;</span>
|
|
<span class="p">},</span> <span class="p">{});</span>
|
|
<span class="p">}</span>
|
|
<span class="p">};</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="nx">client</span><span class="p">.</span><span class="nx">QueryBuilder</span> <span class="o">=</span> <span class="nx">QueryBuilder_SQLite3</span><span class="p">;</span>
|
|
<span class="nx">client</span><span class="p">.</span><span class="nx">QueryCompiler</span> <span class="o">=</span> <span class="nx">QueryCompiler_SQLite3</span><span class="p">;</span>
|
|
|
|
<span class="p">};</span></div></div></div></div></body></html> |