mirror of
https://github.com/knex/knex.git
synced 2025-08-02 13:52:09 +00:00
55 lines
15 KiB
HTML
55 lines
15 KiB
HTML
<!DOCTYPE html><html lang="en"><head><title>clients/server/postgres/grammar</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="clients/server/postgres/grammar"><meta name="groc-project-path" content="clients/server/postgres/grammar.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">clients/server/postgres/grammar.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="postgresql-grammar">PostgreSQL Grammar</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><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">Helpers</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../../lib/helpers'</span><span class="p">).</span><span class="nx">Helpers</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">baseGrammar</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../base/grammar'</span><span class="p">).</span><span class="nx">baseGrammar</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Extends the standard sql grammar.</p></div></div><div class="code"><div class="wrapper"><span class="nx">exports</span><span class="p">.</span><span class="nx">grammar</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">({</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The keyword identifier wrapper format.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrapValue</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nx">value</span> <span class="o">!==</span> <span class="s1">'*'</span> <span class="o">?</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">format</span><span class="p">(</span><span class="s1">'"%s"'</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">:</span> <span class="s2">"*"</span><span class="p">);</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles a truncate query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileTruncate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">'truncate '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' restart identity'</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>insert</code> query, allowing for multiple
|
|
inserts using a single query statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileInsert</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">values</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">pluck</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="mi">0</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">paramBlocks</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there are any "where" clauses, we need to omit
|
|
any bindings that may have been associated with them.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">clearWhereBindings</span><span class="p">(</span><span class="nx">qb</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">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</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">columns</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">'default values'</span><span class="p">;</span>
|
|
<span class="p">}</span> <span class="k">else</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">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="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">paramBlocks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">"("</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">pluck</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="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">")"</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="s2">"("</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s2">") values "</span> <span class="o">+</span> <span class="nx">paramBlocks</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="nx">sql</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileReturning</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="nx">sql</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, allowing for a return value.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileUpdate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="nx">baseGrammar</span><span class="p">.</span><span class="nx">compileUpdate</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="nx">sql</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileReturning</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Adds the returning value to the statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileReturning</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">sql</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">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">)</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">isArray</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">' returning '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapArray</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">);</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">' returning '</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapValue</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
|
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Ensures the response is returned in the same format as other clients.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">handleResponse</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span> <span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">returning</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">'SELECT'</span><span class="p">)</span> <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nx">rows</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">'INSERT'</span> <span class="o">||</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">'UPDATE'</span> <span class="o">&&</span> <span class="nx">returning</span><span class="p">))</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">response</span><span class="p">.</span><span class="nx">rows</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">returning</span> <span class="o">===</span> <span class="s1">'*'</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">returning</span><span class="p">))</span> <span class="k">return</span> <span class="nx">row</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="nx">row</span><span class="p">[</span><span class="nx">returning</span><span class="p">];</span>
|
|
<span class="p">});</span>
|
|
<span class="p">}</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">'UPDATE'</span> <span class="o">||</span> <span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">'DELETE'</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nx">rowCount</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>
|
|
|
|
<span class="p">},</span> <span class="nx">baseGrammar</span><span class="p">);</span></div></div></div></div></body></html> |