2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
4 <!ENTITY % myents SYSTEM "entities.inc">
8 <!-- Symbolic SQL Syntax -->
9 <reference id="ref-syntax">
10 <title>The Symbolic SQL Syntax</title>
13 &clsql; provides a symbolic syntax allowing the construction of
14 SQL expressions as lists delimited by square brackets. The
15 syntax is turned off by default. This section describes
16 utilities for enabling and disabling the square bracket reader
17 syntax and for constructing symbolic SQL expressions.
21 <refentry id="enable-sql-reader-syntax">
23 <refentrytitle>ENABLE-SQL-READER-SYNTAX</refentrytitle>
26 <refname>ENABLE-SQL-READER-SYNTAX</refname>
27 <refpurpose>Globally enable square bracket reader syntax.</refpurpose>
28 <refclass>Macro</refclass>
33 <function>enable-sql-reader-syntax</function> => <returnvalue></returnvalue></synopsis>
36 <title>Arguments and Values</title>
40 <title>Description</title>
41 <para>Turns on the SQL reader syntax setting the syntax state
42 such that if the syntax is subsequently disabled, <link
43 linkend="restore-sql-reader-syntax-state">
44 <function>restore-sql-reader-syntax-state</function></link> will
49 <title>Examples</title>
53 <title>Side Effects</title>
55 Sets the internal syntax state to enabled.
58 Modifies the default readtable.
62 <title>Affected by</title>
68 <title>Exceptional Situations</title>
74 <title>See Also</title>
76 <member><link linkend="disable-sql-reader-syntax"><function>disable-sql-reader-syntax</function></link></member>
77 <member><link linkend="locally-enable-sql-reader-syntax"><function>locally-enable-sql-reader-syntax</function></link></member>
78 <member><link linkend="locally-disable-sql-reader-syntax"><function>locally-disable-sql-reader-syntax</function></link></member>
79 <member><link linkend="restore-sql-reader-syntax-state"><function>restore-sql-reader-syntax-state</function></link></member>
85 The symbolic SQL syntax is disabled by default.
88 &clsql; differs from &commonsql; in that
89 <function>enable-sql-reader-syntax</function> is defined as a
90 macro rather than a function.
95 <refentry id="disable-sql-reader-syntax">
97 <refentrytitle>DISABLE-SQL-READER-SYNTAX</refentrytitle>
100 <refname>DISABLE-SQL-READER-SYNTAX</refname>
101 <refpurpose>Globally disable square bracket reader syntax.</refpurpose>
102 <refclass>Macro</refclass>
105 <title>Syntax</title>
107 <function>disable-sql-reader-syntax</function> => <returnvalue></returnvalue></synopsis>
110 <title>Arguments and Values</title>
114 <title>Description</title>
115 <para>Turns off the SQL reader syntax setting the syntax state
116 such that if the syntax is subsequently enabled,
117 <link linkend="restore-sql-reader-syntax-state">
118 <function>restore-sql-reader-syntax-state</function></link> will
123 <title>Examples</title>
127 <title>Side Effects</title>
129 Sets the internal syntax state to disabled.
132 Modifies the default readtable.
136 <title>Affected by</title>
142 <title>Exceptional Situations</title>
148 <title>See Also</title>
150 <member><link linkend="enable-sql-reader-syntax"><function>enable-sql-reader-syntax</function></link></member>
151 <member><link linkend="locally-enable-sql-reader-syntax"><function>locally-enable-sql-reader-syntax</function></link></member>
152 <member><link linkend="locally-disable-sql-reader-syntax"><function>locally-disable-sql-reader-syntax</function></link></member>
153 <member><link linkend="restore-sql-reader-syntax-state"><function>restore-sql-reader-syntax-state</function></link></member>
159 The symbolic SQL syntax is disabled by default.
162 &clsql; differs from &commonsql; in that
163 <function>disable-sql-reader-syntax</function> is defined as a
164 macro rather than a function.
169 <refentry id="locally-enable-sql-reader-syntax">
171 <refentrytitle>LOCALLY-ENABLE-SQL-READER-SYNTAX</refentrytitle>
174 <refname>LOCALLY-ENABLE-SQL-READER-SYNTAX</refname>
175 <refpurpose>Globally enable square bracket reader syntax.</refpurpose>
176 <refclass>Macro</refclass>
179 <title>Syntax</title>
181 <function>locally-enable-sql-reader-syntax</function> => <returnvalue></returnvalue></synopsis>
184 <title>Arguments and Values</title>
188 <title>Description</title>
189 <para>Turns on the SQL reader syntax without changing the syntax
190 state such that <link linkend="restore-sql-reader-syntax-state">
191 <function>restore-sql-reader-syntax-state</function></link> will
192 re-establish the current syntax state.
196 <title>Examples</title>
197 <para>Intended to be used in a file for code which uses the
198 square bracket syntax without changing the global state.
201 #.(locally-enable-sql-reader-syntax)
203 ... CODE USING SYMBOLIC SQL SYNTAX ...
205 #.(restore-sql-reader-syntax-state)
209 <title>Side Effects</title>
211 Modifies the default readtable.
215 <title>Affected by</title>
219 <title>Exceptional Situations</title>
225 <title>See Also</title>
227 <member><link linkend="enable-sql-reader-syntax"><function>enable-sql-reader-syntax</function></link></member>
228 <member><link linkend="disable-sql-reader-syntax"><function>disable-sql-reader-syntax</function></link></member>
229 <member><link linkend="locally-disable-sql-reader-syntax"><function>locally-disable-sql-reader-syntax</function></link></member>
230 <member><link linkend="restore-sql-reader-syntax-state"><function>restore-sql-reader-syntax-state</function></link></member>
236 The symbolic SQL syntax is disabled by default.
239 &clsql; differs from &commonsql; in that
240 <function>locally-enable-sql-reader-syntax</function> is
241 defined as a macro rather than a function.
247 <refentry id="locally-disable-sql-reader-syntax">
249 <refentrytitle>LOCALLY-DISABLE-SQL-READER-SYNTAX</refentrytitle>
252 <refname>LOCALLY-DISABLE-SQL-READER-SYNTAX</refname>
253 <refpurpose>Locally disable square bracket reader syntax.</refpurpose>
254 <refclass>Macro</refclass>
257 <title>Syntax</title>
259 <function>locally-disable-sql-reader-syntax</function> => <returnvalue></returnvalue></synopsis>
262 <title>Arguments and Values</title>
266 <title>Description</title>
267 <para>Turns off the SQL reader syntax without changing the
268 syntax state such that <link
269 linkend="restore-sql-reader-syntax-state">
270 <function>restore-sql-reader-syntax-state</function></link> will
271 re-establish the current syntax state.
275 <title>Examples</title>
276 <para>Intended to be used in a file for code in which the square
277 bracket syntax should be disabled without changing the global
281 #.(locally-disable-sql-reader-syntax)
283 ... CODE NOT USING SYMBOLIC SQL SYNTAX ...
285 #.(restore-sql-reader-syntax-state)
289 <title>Side Effects</title>
291 Modifies the default readtable.
295 <title>Affected by</title>
301 <title>Exceptional Situations</title>
307 <title>See Also</title>
309 <member><link linkend="enable-sql-reader-syntax"><function>enable-sql-reader-syntax</function></link></member>
310 <member><link linkend="disable-sql-reader-syntax"><function>disable-sql-reader-syntax</function></link></member>
311 <member><link linkend="locally-enable-sql-reader-syntax"><function>locally-enable-sql-reader-syntax</function></link></member>
312 <member><link linkend="restore-sql-reader-syntax-state"><function>restore-sql-reader-syntax-state</function></link></member>
318 The symbolic SQL syntax is disabled by default.
321 &clsql; differs from &commonsql; in that
322 <function>locally-disable-sql-reader-syntax</function> is
323 defined as a macro rather than a function.
328 <refentry id="restore-sql-reader-syntax-state">
330 <refentrytitle>RESTORE-SQL-READER-SYNTAX-STATE</refentrytitle>
333 <refname>RESTORE-SQL-READER-SYNTAX-STATE</refname>
335 Restore square bracket reader syntax to its previous state.
337 <refclass>Macro</refclass>
340 <title>Syntax</title>
342 <function>restore-sql-reader-syntax-state</function> => <returnvalue></returnvalue></synopsis>
345 <title>Arguments and Values</title>
349 <title>Description</title>
350 <para>Enables the SQL reader syntax if <link
351 linkend="enable-sql-reader-syntax">
352 <function>enable-sql-reader-syntax</function></link> has been
353 called more recently than <link
354 linkend="disable-sql-reader-syntax">
355 <function>disable-sql-reader-syntax</function></link> and
356 otherwise disables the SQL reader syntax. By default, the SQL
357 reader syntax is disabled.
361 <title>Examples</title>
364 linkend="locally-enable-sql-reader-syntax">
365 <function>locally-enable-sql-reader-syntax</function></link> and
367 linkend="locally-disable-sql-reader-syntax">
368 <function>locally-disable-sql-reader-syntax</function></link>.
372 <title>Side Effects</title>
374 Reverts the internal syntax state.
377 Modifies the default readtable.
381 <title>Affected by</title>
382 <para>The current internal syntax state.</para>
385 <title>Exceptional Situations</title>
391 <title>See Also</title>
393 <member><link linkend="enable-sql-reader-syntax"><function>enable-sql-reader-syntax</function></link></member>
394 <member><link linkend="disable-sql-reader-syntax"><function>disable-sql-reader-syntax</function></link></member>
395 <member><link linkend="locally-enable-sql-reader-syntax"><function>locally-enable-sql-reader-syntax</function></link></member>
396 <member><link linkend="locally-disable-sql-reader-syntax"><function>locally-disable-sql-reader-syntax</function></link></member>
402 The symbolic SQL syntax is disabled by default.
405 &clsql; differs from &commonsql; in that
406 <function>restore-sql-reader-syntax-state</function> is
407 defined as a macro rather than a function.
412 <refentry id="file-enable-sql-reader-syntax">
414 <refentrytitle>FILE-ENABLE-SQL-READER-SYNTAX</refentrytitle>
417 <refname>FILE-ENABLE-SQL-READER-SYNTAX</refname>
419 Enable the square bracket reader syntax for the duration of the file.
421 <refclass>Macro</refclass>
424 <title>Syntax</title>
426 <function>file-enable-sql-reader-syntax</function> => <returnvalue></returnvalue></synopsis>
429 <title>Arguments and Values</title>
433 <title>Description</title>
434 <para>Uncoditionally enables the SQL reader syntax. Unlike <link
435 linkend="enable-sql-reader-syntax">
436 <function>enable-sql-reader-syntax</function></link> and <link
437 linkend="disable-sql-reader-syntax">
438 <function>disable-sql-reader-syntax</function></link> which try to keep track of whether
439 the syntax has been enabled or disabled and keep track of the old read-table for restoration this function just enables it unconditionally.
441 <para>Once enabled this way there is no corresponding disable function but instead relies on being used in a file context. The spec for <ulink url="http://www.lispworks.com/documentation/lw51/CLHS/Body/f_load.htm">load</ulink> and <ulink url="http://www.lispworks.com/documentation/lw51/CLHS/Body/f_cmp_fi.htm">compile-file</ulink> states that the *readtable* will be restored after processing the file.
444 <title>Examples</title>
445 <para>Intended to be used at the top of a file that contains sql reader syntax.</para>
447 (in-package :my-package)
448 (clsql:file-enable-sql-reader-syntax)
450 ;;functions that use the square bracket syntax.
454 <title>Side Effects</title>
456 Modifies the readtable.
460 <title>Affected by</title>
464 <title>Exceptional Situations</title>
470 <title>See Also</title>
472 <member><link linkend="enable-sql-reader-syntax"><function>enable-sql-reader-syntax</function></link></member>
473 <member><link linkend="disable-sql-reader-syntax"><function>disable-sql-reader-syntax</function></link></member>
474 <member><link linkend="locally-enable-sql-reader-syntax"><function>locally-enable-sql-reader-syntax</function></link></member>
475 <member><link linkend="locally-disable-sql-reader-syntax"><function>locally-disable-sql-reader-syntax</function></link></member>
481 Unique to &clsql;, not present in &commonsql;.
488 <refentrytitle>SQL</refentrytitle>
491 <refname>SQL</refname>
492 <refpurpose>Construct an SQL string from supplied expressions.</refpurpose>
493 <refclass>Function</refclass>
496 <title>Syntax</title>
498 <function>sql &rest</function> <replaceable>args</replaceable> => <returnvalue>sql-expression</returnvalue></synopsis>
501 <title>Arguments and Values</title>
504 <term><parameter>args</parameter></term>
506 <para>A set of expressions.</para>
510 <term><returnvalue>sql-expression</returnvalue></term>
512 <para>A string representing an SQL expression.</para>
518 <title>Description</title>
519 <para>Returns an SQL string generated from the expressions
520 <parameter>args</parameter>. The expressions are translated into
521 SQL strings and then concatenated with a single space delimiting
526 <title>Examples</title>
540 (sql '(nil foo "bar" 10))
541 => "(NULL,FOO,'bar',10)"
543 (sql #(nil foo "bar" 10))
544 => "NULL,FOO,'bar',10"
546 (sql [select [foo] [bar] :from [baz]] 'having [= [foo id] [bar id]]
547 'and [foo val] '< 5)
548 => "SELECT FOO,BAR FROM BAZ HAVING (FOO.ID = BAR.ID) AND FOO.VAL < 5"
552 <title>Side Effects</title>
556 <title>Affected by</title>
562 <title>Exceptional Situations</title>
563 <para>An error of type <link
564 linkend="sql-user-error"><function>sql-user-error</function></link>
565 is signalled if any element in <parameter>args</parameter> is
566 not of the supported types (a symbol, string, number or symbolic
567 SQL expression) or a list or vector containing only these
572 <title>See Also</title>
574 <member><link linkend="sql-expression"><function>sql-expression</function></link></member>
575 <member><link linkend="sql-operation"><function>sql-operation</function></link></member>
576 <member><link linkend="sql-operator"><function>sql-operator</function></link></member>
585 <refentry id="sql-expression">
587 <refentrytitle>SQL-EXPRESSION</refentrytitle>
590 <refname>SQL-EXPRESSION</refname>
591 <refpurpose>Constructs an SQL expression from supplied keyword arguments.</refpurpose>
592 <refclass>Function</refclass>
595 <title>Syntax</title>
597 <function>sql-expression &key</function> <parameter>string</parameter> <parameter>table</parameter> <parameter>alias</parameter> <parameter>attribute</parameter> <parameter>type</parameter> => <returnvalue>result</returnvalue></synopsis>
600 <title>Arguments and Values</title>
603 <term><parameter>string</parameter></term>
605 <para>A string.</para>
609 <term><parameter>table</parameter></term>
611 <para>A symbol representing a database table identifier.</para>
615 <term><parameter>alias</parameter></term>
617 <para>A table alias.</para>
621 <term><parameter>attribute</parameter></term>
623 <para>A symbol representing an attribute identifier.</para>
627 <term><parameter>type</parameter></term>
629 <para>A type specifier.</para>
633 <term><returnvalue>result</returnvalue></term>
635 <para>A object of type <type>sql-expression</type>.</para>
641 <title>Description</title>
642 <para>Returns an SQL expression constructed from the supplied
643 arguments which may be combined as follows:</para>
644 <itemizedlist mark='opencircle'>
647 <parameter>attribute</parameter> and
648 <parameter>type</parameter>;
653 <parameter>attribute</parameter>;
658 <parameter>alias</parameter> or <parameter>table</parameter> and
659 <parameter>attribute</parameter> and
660 <parameter>type</parameter>;
665 <parameter>alias</parameter> or
666 <parameter>table</parameter> and
667 <parameter>attribute</parameter>;
672 <parameter>table</parameter>,
673 <parameter>attribute</parameter> and
674 <parameter>type</parameter>;
679 <parameter>table</parameter> and
680 <parameter>attribute</parameter>;
685 <parameter>table</parameter>
686 and <parameter>alias</parameter>;
691 <parameter>table</parameter>;
696 <parameter>string</parameter>.
702 <title>Examples</title>
704 (sql-expression :table 'foo :attribute 'bar)
705 => #<CLSQL-SYS:SQL-IDENT-ATTRIBUTE FOO.BAR>
707 (sql-expression :attribute 'baz)
708 => #<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BAZ>
712 <title>Side Effects</title>
716 <title>Affected by</title>
722 <title>Exceptional Situations</title>
723 <para>An error of type <link
724 linkend="sql-user-error"><function>sql-user-error</function></link>
725 is signalled if an unsupported combination of keyword arguments is
730 <title>See Also</title>
732 <member><link linkend="sql"><function>sql</function></link></member>
733 <member><link linkend="sql-operation"><function>sql-operation</function></link></member>
734 <member><link linkend="sql-operator"><function>sql-operator</function></link></member>
743 <refentry id="sql-operation">
745 <refentrytitle>SQL-OPERATION</refentrytitle>
748 <refname>SQL-OPERATION</refname>
749 <refpurpose>Constructs an SQL expression from a supplied operator and arguments.</refpurpose>
750 <refclass>Function</refclass>
753 <title>Syntax</title>
755 <function>sql-operation</function> <parameter>operator</parameter> <function>&rest</function> <parameter>args</parameter> => <returnvalue>result</returnvalue></synopsis>
757 <function>sql-operation</function> 'function <parameter>func</parameter> <function>&rest</function> <parameter>args</parameter> => <returnvalue>result</returnvalue></synopsis>
760 <title>Arguments and Values</title>
763 <term><parameter>operator</parameter></term>
765 <para>A symbol denoting an SQL operator.</para>
769 <term><parameter>func</parameter></term>
771 <para>A string denoting an SQL function.</para>
775 <term><parameter>args</parameter></term>
777 <para>A set of arguments for the specified SQL operator or function.</para>
781 <term><returnvalue>result</returnvalue></term>
783 <para>A object of type <function>sql-expression</function>.</para>
789 <title>Description</title>
790 <para>Returns an SQL expression constructed from the supplied
791 SQL operator or function <parameter>operator</parameter> and
792 its arguments <parameter>args</parameter>. If
793 <parameter>operator</parameter> is passed the symbol 'function
794 then the first value in <parameter>args</parameter> is taken to
795 be a valid SQL function and the remaining values in
796 <parameter>args</parameter> its arguments.
800 <title>Examples</title>
802 (sql-operation 'select
803 (sql-expression :table 'foo :attribute 'bar)
804 (sql-operation 'sum (sql-expression :table 'foo :attribute 'baz))
806 (sql-expression :table 'foo)
808 (sql-operation '> (sql-expression :attribute 'bar) 12)
809 :order-by (sql-operation 'sum (sql-expression :attribute 'baz)))
810 => #<SQL-QUERY SELECT FOO.BAR,SUM(FOO.BAZ) FROM FOO WHERE (BAR > 12) ORDER BY SUM(BAZ)>
812 (sql-operation 'function "strpos" "CLSQL" "SQL")
813 => #<CLSQL-SYS:SQL-FUNCTION-EXP STRPOS('CLSQL','SQL')>
817 <title>Side Effects</title>
821 <title>Affected by</title>
827 <title>Exceptional Situations</title>
828 <para>An error of type <link
829 linkend="sql-user-error"><function>sql-user-error</function></link>
830 is signalled if <parameter>operator</parameter> is not a symbol
831 representing a supported SQL operator.</para>
834 <title>See Also</title>
836 <member><link linkend="sql"><function>sql</function></link></member>
837 <member><link linkend="sql-expression"><function>sql-expression</function></link></member>
838 <member><link linkend="sql-operator"><function>sql-operator</function></link></member>
847 <refentry id="sql-operator">
849 <refentrytitle>SQL-OPERATOR</refentrytitle>
852 <refname>SQL-OPERATOR</refname>
853 <refpurpose>Returns the symbol for the supplied SQL operator.</refpurpose>
854 <refclass>Function</refclass>
857 <title>Syntax</title>
859 <function>sql-operator</function> <parameter>operator</parameter> => <returnvalue>result</returnvalue></synopsis>
862 <title>Arguments and Values</title>
865 <term><parameter>operator</parameter></term>
867 <para>A symbol denoting an SQL operator.</para>
871 <term><returnvalue>result</returnvalue></term>
873 <para>The Lisp symbol used by &clsql; to represent the
874 specified operator.</para>
880 <title>Description</title>
881 <para>Returns the Lisp symbol corresponding to the SQL operator
882 represented by the symbol <parameter>operator</parameter>. If
883 <parameter>operator</parameter> does not represent a supported
884 SQL operator or is not a symbol, nil is returned.
888 <title>Examples</title>
895 <title>Side Effects</title>
899 <title>Affected by</title>
905 <title>Exceptional Situations</title>
909 <title>See Also</title>
911 <member><link linkend="sql"><function>sql</function></link></member>
912 <member><link linkend="sql-expression"><function>sql-expression</function></link></member>
913 <member><link linkend="sql-operation"><function>sql-operation</function></link></member>
919 &clsql;'s symbolic SQL syntax currently has support for the
920 following &commonsql; compatible SQL operators:
923 <!-- CommonSQL Compatible -->
924 <member><function>any</function></member>
925 <member><function>some</function></member>
926 <member><function>all</function></member>
927 <member><function>not</function></member>
928 <member><function>union</function></member>
929 <member><function>intersect</function></member>
930 <member><function>minus</function></member>
931 <member><function>except
933 <member><function>order-by
935 <member><function>null
945 <member><function>like
947 <member><function>and
953 <member><function>substr
959 <member><function><
965 <member><function><=
967 <member><function><>
969 <member><function>count
971 <member><function>max
973 <member><function>min
975 <member><function>avg
977 <member><function>sum
979 <member><function>function
981 <member><function>between
983 <member><function>distinct
985 <member><function>nvl
987 <member><function>slot-value
989 <member><function>userenv
993 as well as the pseudo-operator <function>function</function>.
995 <para> The following operators are provided as &clsql; extensions to
998 <!-- CLSQL Extensions -->
999 <member><function>concat
1000 </function></member>
1001 <member><function>substring
1002 </function></member>
1003 <member><function>limit
1004 </function></member>
1005 <member><function>group-by
1006 </function></member>
1007 <member><function>having
1008 </function></member>
1009 <member><function>not-null
1010 </function></member>
1011 <member><function>exists
1012 </function></member>
1013 <member><function>uplike
1014 </function></member>
1015 <member><function>is
1016 </function></member>
1017 <member><function>==
1018 </function></member>
1019 <member><function>the
1020 </function></member>
1021 <member><function>coalesce
1022 </function></member>
1023 <member><function>view-class
1024 </function></member>
1028 Note that some of these operators are not supported by all of
1029 the RDBMS supported by &clsql; (see the <link
1030 linkend="appendix">Appendix</link> for details).