Automated commit for debian release 6.7.2-1
[clsql.git] / sql / syntax.lisp
index f00545e9c22d288fd2afffbf985790e1264195e5..68fa8aad7462b2e5ccacffc82d7271537a7d81b1 100644 (file)
@@ -1,8 +1,6 @@
 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; *************************************************************************
 ;;;;
-;;;; $Id$
-;;;;
 ;;;; CLSQL square bracket symbolic query syntax. Functions for
 ;;;; enabling and disabling the syntax and for building SQL
 ;;;; expressions using the syntax.
@@ -43,7 +41,7 @@ the current syntax state."
     (%disable-sql-reader-syntax)))
 
 (defun %disable-sql-reader-syntax ()
-  (when *original-readtable* 
+  (when *original-readtable*
     (setf *readtable* *original-readtable*
           *original-readtable* nil))
   (values))
@@ -66,6 +64,15 @@ the current syntax state."
   '(eval-when (:compile-toplevel :load-toplevel :execute)
     (%enable-sql-reader-syntax)))
 
+(defmacro file-enable-sql-reader-syntax ()
+  "Turns on the SQL reader syntax for the rest of the file.
+The CL spec says that when finished loading a file the original
+*readtable* is restored.  clhs COMPILE-FILE"
+  '(eval-when (:compile-toplevel :load-toplevel :execute)
+    (setf *readtable* (copy-readtable))
+    (set-macro-character *sql-macro-open-char* #'sql-reader-open)
+    (set-macro-character *sql-macro-close-char* (get-macro-character #\)))))
+
 (defun %enable-sql-reader-syntax ()
   (unless *original-readtable*
     (setf *original-readtable* *readtable*
@@ -89,42 +96,50 @@ reader syntax is disabled."
   (let ((sqllist (read-delimited-list #\] stream t)))
     (unless *read-suppress*
       (handler-case
-         (cond ((string= (write-to-string (car sqllist)) "||")
-                (cons (sql-operator 'concat-op) (cdr sqllist)))
-               ((and (= (length sqllist) 1) (eql (car sqllist) '*))
-                (apply #'generate-sql-reference sqllist))
-               ((sql-operator (car sqllist))
-                (cons (sql-operator (car sqllist)) (cdr sqllist)))
-               (t (apply #'generate-sql-reference sqllist)))
-       (sql-user-error (c)
-         (error 'sql-user-error
-                :message (format nil "Error ~A occured while attempting to parse '~A' at file position ~A"
-                                 (sql-user-error-message c) sqllist (file-position stream))))))))
+          (cond ((string= (write-to-string (car sqllist)) "||")
+                 (cons (sql-operator 'concat-op) (cdr sqllist)))
+                ((and (= (length sqllist) 1) (eql (car sqllist) '*))
+                 (apply #'generate-sql-reference sqllist))
+                ((sql-operator (car sqllist))
+                 (cons (sql-operator (car sqllist)) (cdr sqllist)))
+                (t (apply #'generate-sql-reference sqllist)))
+        (sql-user-error (c)
+          (error 'sql-user-error
+                 :message (format nil "Error ~A occured while attempting to parse '~A' at file position ~A"
+                                  (sql-user-error-message c) sqllist (file-position stream))))))))
 
 (defun generate-sql-reference (&rest arglist)
-  (cond ((= (length arglist) 1)        ; string, table or attribute
-        (if (stringp (car arglist))
-            (sql-expression :string (car arglist))
-             (sql-expression :attribute (car arglist))))
-       ((<= 2 (length arglist))
-        (let ((sqltype (when (keywordp (caddr arglist)) (caddr arglist) nil)))
+  (cond ((= (length arglist) 1) ; string, table or attribute
+         (let ((arg (first arglist)))
+           (typecase arg
+             (string (sql-expression :string arg))
+             (symbol ;; handle . separated names
+              (let* ((sn (symbol-name arg))
+                     (idx (position #\. sn)))
+                (cond
+                  (idx (sql-expression :table (intern (subseq sn 0 idx))
+                                       :attribute (intern (subseq sn (+ idx 1))) ))
+                  (T (sql-expression :attribute arg))))
+              ))))
+        ((<= 2 (length arglist))
+         (let ((sqltype (when (keywordp (caddr arglist)) (caddr arglist) nil)))
            (cond
              ((stringp (cadr arglist))
-            (sql-expression :table (car arglist)
-                            :alias (cadr arglist)
-                            :type sqltype))
-           ((keywordp (cadr arglist))
-            (sql-expression :attribute (car arglist)
-                            :type (cadr arglist)))
-           (t
-            (sql-expression :attribute (cadr arglist)
-                            :table (car arglist)
-                            :type sqltype)))))
-       (t
-        (error 'sql-user-error :message "bad expression syntax"))))
-
-
-;; Exported functions for dealing with SQL syntax 
+             (sql-expression :table (car arglist)
+                             :alias (cadr arglist)
+                             :type sqltype))
+            ((keywordp (cadr arglist))
+             (sql-expression :attribute (car arglist)
+                             :type (cadr arglist)))
+            (t
+             (sql-expression :attribute (cadr arglist)
+                             :table (car arglist)
+                             :type sqltype)))))
+        (t
+         (error 'sql-user-error :message "bad expression syntax"))))
+
+
+;; Exported functions for dealing with SQL syntax
 
 (defun sql (&rest args)
   "Returns an SQL string generated from the expressions ARGS. The
@@ -148,7 +163,7 @@ keyword arguments is specified."
     (string
      (make-instance 'sql :string string))
     (attribute
-     (make-instance 'sql-ident-attribute  :name attribute
+     (make-instance 'sql-ident-attribute :name attribute
                     :qualifier (or table alias)
                     :type type))
     ((and table (not attribute))
@@ -176,8 +191,8 @@ function and the remaining values in ARGS its arguments as
 strings."
   (if (sql-operator operator)
       (apply (symbol-function (sql-operator operator)) args)
-      (error 'sql-user-error 
-             :message 
+      (error 'sql-user-error
+             :message
              (format nil "~A is not a recognized SQL operator." operator))))