This file is indexed.

/usr/share/doc/haskell-haskelldb-doc/html/src/Database-HaskellDB.html is in libghc-haskelldb-doc 2.1.1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Database/HaskellDB.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE FlexibleInstances #-}</span>
<a name="line-2"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-3"></a><span class='hs-comment'>-- |</span>
<a name="line-4"></a><span class='hs-comment'>-- Module      :  HaskellDB</span>
<a name="line-5"></a><span class='hs-comment'>-- Copyright   :  Daan Leijen (c) 1999, daan@cs.uu.nl</span>
<a name="line-6"></a><span class='hs-comment'>--                HWT Group (c) 2003, haskelldb-users@lists.sourceforge.net</span>
<a name="line-7"></a><span class='hs-comment'>-- License     :  BSD-style</span>
<a name="line-8"></a><span class='hs-comment'>-- </span>
<a name="line-9"></a><span class='hs-comment'>-- Maintainer  :  "Justin Bailey" &lt;jgbailey@gmail.com&gt;</span>
<a name="line-10"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-11"></a><span class='hs-comment'>-- Portability :  non portable</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- HaskellDB is a Haskell library for expressing database queries and</span>
<a name="line-14"></a><span class='hs-comment'>-- operations in a type safe and declarative way. HaskellDB compiles a</span>
<a name="line-15"></a><span class='hs-comment'>-- relational algebra-like syntax into SQL, submits the operations to the</span>
<a name="line-16"></a><span class='hs-comment'>-- database for processing, and returns the results as ordinary Haskell</span>
<a name="line-17"></a><span class='hs-comment'>-- values.</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- This is the main module that the user should </span>
<a name="line-20"></a><span class='hs-comment'>-- import. Beside this module, the user should import a</span>
<a name="line-21"></a><span class='hs-comment'>-- particular database binding (ie. "Database.HaskellDB.HSQL.ODBC") </span>
<a name="line-22"></a><span class='hs-comment'>-- and database definitions.</span>
<a name="line-23"></a><span class='hs-comment'>--</span>
<a name="line-24"></a><span class='hs-comment'>-- HaskellDB was originally written by Daan Leijen and it's </span>
<a name="line-25"></a><span class='hs-comment'>-- design is described in the paper Domain Specific Embedded </span>
<a name="line-26"></a><span class='hs-comment'>-- Compilers, Daan Leijen and Erik Meijer. 2nd USENIX </span>
<a name="line-27"></a><span class='hs-comment'>-- Conference on Domain-Specific Languages (DSL), Austin, </span>
<a name="line-28"></a><span class='hs-comment'>-- USA, October 1999 (&lt;<a href="http://www.usenix.org/events/dsl99/">http://www.usenix.org/events/dsl99/</a>&gt;).</span>
<a name="line-29"></a><span class='hs-comment'>--</span>
<a name="line-30"></a><span class='hs-comment'>-- This new version of HaskellDB was produced as a student project at</span>
<a name="line-31"></a><span class='hs-comment'>-- Chalmers University of Technology in Gothenburg, Sweden. The aim of the</span>
<a name="line-32"></a><span class='hs-comment'>-- project was to make HaskellDB a practically useful database library.</span>
<a name="line-33"></a><span class='hs-comment'>-- That work is described in </span>
<a name="line-34"></a><span class='hs-comment'>-- Student Paper: HaskellDB Improved, </span>
<a name="line-35"></a><span class='hs-comment'>-- Björn Bringert, Anders Höckersten, Conny Andersson, Martin Andersson, </span>
<a name="line-36"></a><span class='hs-comment'>-- Mary Bergman, Victor Blomqvist and Torbjörn Martin. </span>
<a name="line-37"></a><span class='hs-comment'>-- In Proceedings of the ACM SIGPLAN 2004 Haskell Workshop, Snowbird, Utah, </span>
<a name="line-38"></a><span class='hs-comment'>-- USA, September 22, 2004.</span>
<a name="line-39"></a><span class='hs-comment'>-- (&lt;<a href="http://haskelldb.sourceforge.net/haskelldb.pdf">http://haskelldb.sourceforge.net/haskelldb.pdf</a>&gt;)</span>
<a name="line-40"></a><span class='hs-comment'>--</span>
<a name="line-41"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-42"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span>
<a name="line-43"></a>  <span class='hs-layout'>(</span> <span class='hs-conid'>Rel</span><span class='hs-layout'>,</span> <span class='hs-conid'>Attr</span><span class='hs-layout'>,</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExprAggr</span><span class='hs-layout'>,</span> <span class='hs-conid'>Table</span><span class='hs-layout'>,</span> <span class='hs-conid'>Query</span><span class='hs-layout'>,</span> <span class='hs-conid'>OrderExpr</span>
<a name="line-44"></a>  <span class='hs-comment'>-- * Records</span>
<a name="line-45"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>HasField</span><span class='hs-layout'>,</span> <span class='hs-conid'>Record</span><span class='hs-layout'>,</span> <span class='hs-conid'>Select</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span> <span class='hs-cpp'>#</span> <span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span> <span class='hs-varop'>&lt;&lt;</span> <span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&lt;-</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>!.</span><span class='hs-layout'>)</span>
<a name="line-46"></a>
<a name="line-47"></a>  <span class='hs-comment'>-- * Relational operators</span>
<a name="line-48"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>restrict</span><span class='hs-layout'>,</span> <span class='hs-varid'>table</span><span class='hs-layout'>,</span> <span class='hs-varid'>project</span><span class='hs-layout'>,</span> <span class='hs-varid'>unique</span>
<a name="line-49"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>union</span><span class='hs-layout'>,</span> <span class='hs-varid'>intersect</span><span class='hs-layout'>,</span> <span class='hs-varid'>divide</span><span class='hs-layout'>,</span> <span class='hs-varid'>minus</span>
<a name="line-50"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>copy</span><span class='hs-layout'>,</span> <span class='hs-varid'>copyAll</span><span class='hs-layout'>,</span> <span class='hs-varid'>subQuery</span>
<a name="line-51"></a>
<a name="line-52"></a>  <span class='hs-comment'>-- * Query expressions</span>
<a name="line-53"></a>  <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.==.</span><span class='hs-layout'>)</span> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;&gt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;=.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&gt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&gt;=.</span><span class='hs-layout'>)</span>
<a name="line-54"></a>  <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&amp;&amp;.</span><span class='hs-layout'>)</span> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.||.</span><span class='hs-layout'>)</span>
<a name="line-55"></a>  <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.*.</span><span class='hs-layout'>)</span> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>./.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.+.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.-.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.%.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.++.</span><span class='hs-layout'>)</span>
<a name="line-56"></a>  <span class='hs-layout'>,</span> <span class='hs-sel'>_not</span><span class='hs-layout'>,</span> <span class='hs-varid'>like</span><span class='hs-layout'>,</span> <span class='hs-sel'>_in</span><span class='hs-layout'>,</span> <span class='hs-varid'>cat</span><span class='hs-layout'>,</span> <span class='hs-sel'>_length</span>
<a name="line-57"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>isNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>notNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromVal</span>
<a name="line-58"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>constant</span><span class='hs-layout'>,</span> <span class='hs-varid'>constVal</span><span class='hs-layout'>,</span> <span class='hs-varid'>constNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>constExpr</span>
<a name="line-59"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>param</span><span class='hs-layout'>,</span> <span class='hs-varid'>namedParam</span><span class='hs-layout'>,</span> <span class='hs-conid'>Args</span><span class='hs-layout'>,</span> <span class='hs-varid'>func</span>
<a name="line-60"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>queryParams</span><span class='hs-layout'>,</span> <span class='hs-conid'>Param</span><span class='hs-layout'>,</span> <span class='hs-varid'>cast</span><span class='hs-layout'>,</span> <span class='hs-varid'>coerce</span>
<a name="line-61"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>literal</span><span class='hs-layout'>,</span> <span class='hs-varid'>toStr</span>
<a name="line-62"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>count</span><span class='hs-layout'>,</span> <span class='hs-sel'>_sum</span><span class='hs-layout'>,</span> <span class='hs-sel'>_max</span><span class='hs-layout'>,</span> <span class='hs-sel'>_min</span><span class='hs-layout'>,</span> <span class='hs-varid'>avg</span>
<a name="line-63"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>stddev</span><span class='hs-layout'>,</span> <span class='hs-varid'>stddevP</span><span class='hs-layout'>,</span> <span class='hs-varid'>variance</span><span class='hs-layout'>,</span> <span class='hs-varid'>varianceP</span>
<a name="line-64"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>asc</span><span class='hs-layout'>,</span> <span class='hs-varid'>desc</span><span class='hs-layout'>,</span> <span class='hs-varid'>order</span>
<a name="line-65"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>top</span> <span class='hs-layout'>,</span> <span class='hs-sel'>_case</span> <span class='hs-layout'>,</span> <span class='hs-sel'>_default</span>
<a name="line-66"></a>
<a name="line-67"></a>  <span class='hs-comment'>-- * Database operations</span>
<a name="line-68"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>Database</span>				<span class='hs-comment'>-- abstract</span>
<a name="line-69"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>query</span><span class='hs-layout'>,</span> <span class='hs-varid'>recCat</span>
<a name="line-70"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>insert</span><span class='hs-layout'>,</span> <span class='hs-varid'>delete</span><span class='hs-layout'>,</span> <span class='hs-varid'>update</span><span class='hs-layout'>,</span> <span class='hs-varid'>insertQuery</span>
<a name="line-71"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>tables</span><span class='hs-layout'>,</span> <span class='hs-varid'>describe</span><span class='hs-layout'>,</span> <span class='hs-varid'>transaction</span>
<a name="line-72"></a>          
<a name="line-73"></a>  <span class='hs-comment'>-- * Debugging</span>
<a name="line-74"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>showQuery</span><span class='hs-layout'>,</span> <span class='hs-varid'>showQueryUnOpt</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSql</span><span class='hs-layout'>,</span> <span class='hs-varid'>showSqlUnOpt</span>
<a name="line-75"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>HDBRec</span>
<a name="line-78"></a>
<a name="line-79"></a><span class='hs-comment'>-- PrimQuery type is imported so that haddock can find it.</span>
<a name="line-80"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>PrimQuery</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimQuery</span><span class='hs-layout'>)</span>
<a name="line-81"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Sql</span> <span class='hs-layout'>(</span><span class='hs-conid'>SqlSelect</span><span class='hs-layout'>(</span><span class='hs-conid'>SqlSelect</span><span class='hs-layout'>,</span> <span class='hs-conid'>SqlBin</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>SqlExpr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>SqlName</span><span class='hs-layout'>)</span>
<a name="line-82"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Sql</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span> <span class='hs-layout'>(</span><span class='hs-conid'>SqlSelect</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Mark</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-83"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Sql</span><span class='hs-varop'>.</span><span class='hs-conid'>Generate</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqlQuery</span><span class='hs-layout'>)</span>
<a name="line-84"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Sql</span><span class='hs-varop'>.</span><span class='hs-conid'>Default</span> <span class='hs-layout'>(</span><span class='hs-varid'>defaultSqlGenerator</span><span class='hs-layout'>)</span>
<a name="line-85"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Sql</span><span class='hs-varop'>.</span><span class='hs-conid'>Print</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppSql</span><span class='hs-layout'>)</span>
<a name="line-86"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Optimize</span>  <span class='hs-layout'>(</span><span class='hs-varid'>optimize</span><span class='hs-layout'>)</span>
<a name="line-87"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Query</span>
<a name="line-88"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Database</span>
<a name="line-89"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>PrettyPrint</span><span class='hs-varop'>.</span><span class='hs-conid'>HughesPJ</span> <span class='hs-layout'>(</span><span class='hs-conid'>Doc</span><span class='hs-layout'>)</span>
<a name="line-90"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr'</span><span class='hs-layout'>)</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="Param"></a><span class='hs-comment'>-- | Represents a query parameter. Left parameters are indexed</span>
<a name="line-93"></a><a name="Param"></a><span class='hs-comment'>-- by position, while right parameters are named.</span>
<a name="line-94"></a><a name="Param"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Param</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Int</span> <span class='hs-conid'>String</span>
<a name="line-95"></a>
<a name="line-96"></a><span class='hs-comment'>-- | Shows the optimized SQL for the query.</span>
<a name="line-97"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-98"></a>  <span class='hs-varid'>showsPrec</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>query</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shows</span> <span class='hs-layout'>(</span><span class='hs-varid'>showSql</span> <span class='hs-varid'>query</span><span class='hs-layout'>)</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="showQuery"></a><span class='hs-comment'>-- | Shows the optimized 'PrimQuery'.</span>
<a name="line-101"></a><span class='hs-definition'>showQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-102"></a><span class='hs-definition'>showQuery</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>optimize</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQuery</span>
<a name="line-103"></a>
<a name="line-104"></a><a name="showQueryUnOpt"></a><span class='hs-comment'>-- | Shows the unoptimized 'PrimQuery'.</span>
<a name="line-105"></a><span class='hs-definition'>showQueryUnOpt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-106"></a><span class='hs-definition'>showQueryUnOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQuery</span>
<a name="line-107"></a>
<a name="line-108"></a><a name="showSql"></a><span class='hs-comment'>-- | Shows the optimized SQL query.</span>
<a name="line-109"></a><span class='hs-definition'>showSql</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-110"></a><span class='hs-definition'>showSql</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ppSql</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sqlQuery</span> <span class='hs-varid'>defaultSqlGenerator</span> <span class='hs-varop'>.</span> <span class='hs-varid'>optimize</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQuery</span> 
<a name="line-111"></a>
<a name="line-112"></a><a name="showSqlUnOpt"></a><span class='hs-comment'>-- | Shows the unoptimized SQL query.</span>
<a name="line-113"></a><span class='hs-definition'>showSqlUnOpt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-114"></a><span class='hs-definition'>showSqlUnOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ppSql</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sqlQuery</span> <span class='hs-varid'>defaultSqlGenerator</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQuery</span>
<a name="line-115"></a>
<a name="line-116"></a><a name="queryParams"></a><span class='hs-comment'>-- | Get paramaters from a query in order.</span>
<a name="line-117"></a><span class='hs-definition'>queryParams</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Param</span><span class='hs-keyglyph'>]</span>
<a name="line-118"></a><span class='hs-definition'>queryParams</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>.</span> <span class='hs-varid'>indexParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>selectParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toSelect</span> <span class='hs-varop'>$</span> <span class='hs-varid'>q</span>
<a name="line-119"></a>  <span class='hs-keyword'>where</span>
<a name="line-120"></a>    <span class='hs-comment'>-- Use foldr so we don't have to reverse parameter list built.</span>
<a name="line-121"></a>    <span class='hs-varid'>indexParams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr'</span> <span class='hs-varid'>renumber</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-122"></a>    <span class='hs-varid'>renumber</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span><span class='hs-layout'>,</span> <span class='hs-conid'>Right</span> <span class='hs-varid'>n</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-123"></a>    <span class='hs-varid'>renumber</span> <span class='hs-conid'>Nothing</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>idx</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-124"></a>    <span class='hs-varid'>toSelect</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sqlQuery</span> <span class='hs-varid'>defaultSqlGenerator</span> <span class='hs-varop'>.</span> <span class='hs-varid'>optimize</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQuery</span> 
<a name="line-125"></a>    <span class='hs-comment'>-- | All parameters that are in the select, in the textual order</span>
<a name="line-126"></a>    <span class='hs-comment'>-- they will appear.</span>
<a name="line-127"></a>    <span class='hs-varid'>selectParams</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SqlSelect</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>SqlName</span><span class='hs-keyglyph'>]</span>
<a name="line-128"></a>    <span class='hs-varid'>selectParams</span> <span class='hs-varid'>select</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>SqlSelect</span>  <span class='hs-layout'>{</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>attrs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>tables</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>criteria</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>groupby</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>orderby</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>o</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-129"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>attrParams</span> <span class='hs-varid'>a</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>tableParams</span> <span class='hs-varid'>t</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varid'>criteriaParams</span> <span class='hs-varid'>c</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-130"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>groupByParams</span> <span class='hs-varid'>g</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>orderByParams</span> <span class='hs-varop'>$</span> <span class='hs-varid'>o</span>
<a name="line-131"></a>      <span class='hs-keyword'>where</span>
<a name="line-132"></a>        <span class='hs-varid'>attrParams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getParams</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> 
<a name="line-133"></a>        <span class='hs-varid'>tableParams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getParams</span> <span class='hs-layout'>(</span><span class='hs-varid'>selectParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> 
<a name="line-134"></a>        <span class='hs-varid'>criteriaParams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getParams</span> <span class='hs-varid'>exprParams</span>
<a name="line-135"></a>        <span class='hs-varid'>groupByParams</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> 
<a name="line-136"></a>        <span class='hs-varid'>groupByParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>All</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-137"></a>        <span class='hs-varid'>groupByParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Columns</span> <span class='hs-varid'>cols</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getParams</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varid'>cols</span>
<a name="line-138"></a>        <span class='hs-varid'>orderByParams</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getParams</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprParams</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fst</span><span class='hs-layout'>)</span> 
<a name="line-139"></a>        <span class='hs-varid'>getParams</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>SqlName</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>SqlName</span><span class='hs-keyglyph'>]</span>
<a name="line-140"></a>        <span class='hs-varid'>getParams</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>f</span>
<a name="line-141"></a>        <span class='hs-comment'>-- | All parameters in the expression, in the textual order</span>
<a name="line-142"></a>        <span class='hs-comment'>-- in which they will appear.</span>
<a name="line-143"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SqlExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>SqlName</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ColumnSqlExpr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> 
<a name="line-145"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConstSqlExpr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-146"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParamSqlExpr</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>p</span><span class='hs-keyglyph'>]</span> 
<a name="line-147"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>r</span>
<a name="line-148"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>e</span>
<a name="line-149"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>PostfixSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>e</span>
<a name="line-150"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>concatMap</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-151"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>AggrFunSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>concatMap</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-152"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>CaseSqlExpr</span> <span class='hs-varid'>es</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-153"></a>          <span class='hs-keyword'>let</span> <span class='hs-varid'>caseExprs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>es</span>
<a name="line-154"></a>          <span class='hs-keyword'>in</span> <span class='hs-varid'>caseExprs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>e</span>
<a name="line-155"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListSqlExpr</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>es</span>
<a name="line-156"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ExistsSqlExpr</span> <span class='hs-varid'>select</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>selectParams</span> <span class='hs-varid'>select</span>
<a name="line-157"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-conid'>PlaceHolderSqlExpr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-158"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParensSqlExpr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>e</span>
<a name="line-159"></a>        <span class='hs-varid'>exprParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>CastSqlExpr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exprParams</span> <span class='hs-varid'>e</span>
<a name="line-160"></a>    <span class='hs-varid'>selectParams</span> <span class='hs-layout'>(</span><span class='hs-conid'>SqlBin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>selectParams</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>selectParams</span> <span class='hs-varid'>r</span>
<a name="line-161"></a>    <span class='hs-varid'>selectParams</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
</pre></body>
</html>