X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fsyntax.lisp;h=68fa8aad7462b2e5ccacffc82d7271537a7d81b1;hp=1aec1caa8fc55f3f23025b3848b1a88bc038dd68;hb=HEAD;hpb=d2d49ab13c98bc7a1819a0fd3968268a5567bdc3 diff --git a/sql/syntax.lisp b/sql/syntax.lisp index 1aec1ca..68fa8aa 100644 --- a/sql/syntax.lisp +++ b/sql/syntax.lisp @@ -64,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* @@ -101,9 +110,17 @@ reader syntax is disabled." (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)))) + (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 @@ -146,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))